筆記之sed工具
基礎正則表達式特殊字符歸納表:
RE字符 | 意義 |
^word | 意義:待查找的字符串(word)在行首。 |
word$ | 意義:帶查找的字符串(word)在行尾。 |
. | 意義:代表一定有一個任意字符的字符。 |
\ | 意義:轉義字符,將特殊符號的特殊意義去除。 |
* | 意義:重複零個到無窮多個的前一個字符。 |
[list] | 意義:從字符集合的RE字符裏面找出想要選取的字符。 grep -n 'g[ol]d' test.txt#查找出god,gld字符。 |
[n1-n2] | 意義:從字符集合的RE字符裏面找出想要選取的字符範圍。 grep -n '[0-9]' test.txt grep -n '[a-z]' test.txt grep-n '[A-Z]' test.txt |
[^list] | 意義:從字符集合的RE字符裏面找出不要的字符串或範圍。 ^在[]內時,代表的意義是“反向選擇”的意思。不要大寫[^A-Z] [^a-z] [^0-9] 表示反向的提取。不過,如果每行裏有大寫和小寫字符,如果使用grep -n '[^A-Z]' test.txt 那麼,含有小寫字符的行,就會被列出來。 |
\{n,m\} | 意義:連續n到m個的前一個RE字符,若爲\{n\}則是連續n個的前一個RE字符,若爲\{n,\}則是連續n個以上的前一個RE字符 範例:在g與g之間有2個到3個的o存在的字符串,即(goog)(gooog)grep -n 'go\{2,3\}g' test.txt |
sed工具
sed[-nefr] 動作
參數:
-n:使用安靜模式,一般sed的用法中,所有數據都會被列出到屏幕上,使用-n那就只用被處理過的那行,纔會列舉到屏幕上。
-e:直接在命令行模式上進行sed的動作編輯。
-f:直接將sed的動作卸載一個文件內,-ffilename則可以執行filename內的sed動作。
-r:sed的動作支持的是擴展正則表達式的語法。
-i:直接修改讀取的文件內容,而不是由屏幕輸出。
動作說明:[n1[,n2]] function
n1,n2:不見得會存在,一般代表選擇進行動作的行數,舉例來說,如果我的動作是需要在10到20行之間進行的,則“10,20[動作行爲]”
function有下面這些參數:
a:新增,a的後面可以接字符串,而這些字符串會在新的一行出現(當前的下一行)
c:替換,c的後面可以接字符串,這些字符串可以替換n1,n2之間的行!
d:刪除,因爲是刪除,所以d後面通常不接任何參數。
i:插入,i的後面可以接字符串,而這些字符串會在新的一行出現(當前的上一行)
p:打印,也就是將某個選擇的數據打印出來,通常p會與參數sed -n一起運行的。
s:替換,可以直接進行替換的工作,通常這個s的動作可以搭配正則表達式!例如1,20s/old/new/g。
[root@mysql data]# nl test2.txt #這是完整的test2文本文件,以下的例子我們都由它來舉例。
1woshi 111
2tashi 234
3woshi 456
4tashi 678
5kajdklfjalskd
6sdlkjflka
7lksdjflkasd
※以行爲單位的新增,刪除功能
[root@mysql data]# nl test2.txt |sed '5,7d'#刪除5到7行。
1woshi 111
2tashi 234
3woshi 456
4tashi 678
[root@mysql data]# nl test2.txt |sed '5,$d'#刪除5到最後一行。
1woshi 111
2tashi 234
3woshi 456
4tashi 678
[root@mysql data]# sed -e '4a hahah'test2.txt |nl #新增一行字符數據。(在第4行下)
1woshi 111
2tashi 234
3woshi 456
4tashi 678
5hahah
6kajdklfjalskd
7sdlkjflka
8lksdjflkasd
[root@mysql data]# sed -e '4i hahah'test2.txt |nl #新增一行字符數據。(在第4行上)
1woshi 111
2tashi 234
3woshi 456
4hahah
5tashi 678
6kajdklfjalskd
7sdlkjflka
8lksdjflkasd
※以行爲單位的替換,顯示功能
[root@mysql data]# sed '3,5c dajiadoushi'test2.txt |nl#該爲替換3到5行爲後面的字符數據。
1woshi 111
2tashi 234
3dajiadoushi
4sdlkjflka
5lksdjflkasd
[root@mysql data]# sed '5,7p' test2.txt #加上-n與不加的效果,顯而易見。
woshi 111
tashi 234
woshi 456
tashi 678
kajdklfjalskd
kajdklfjalskd
sdlkjflka
sdlkjflka
lksdjflkasd
lksdjflkasd
[root@mysql data]# sed -n '5,7p' test2.txt #這是加-n的顯示。
kajdklfjalskd
sdlkjflka
lksdjflkasd
※數據查找並替換的功能
sed's/需要被替換的字符串/新字符串/g'或者 sed 's###g'
提示:如果s///g後面的g去掉的話,表示替換每行的第一個匹配的字符串。
如果不去掉g,那麼表示替換說有匹配的字符串。
同時,如果///內出現變量等內容,注意需要使用雙引號。
範:1:截取本地計算機eth0的IP地址。
[root@mysql data]# ifconfig eth0
eth0Link encap:EthernetHWaddr00:0C:29:14:88:2A
inet addr:192.168.126.128Bcast:192.168.126.255Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe14:882a/64 Scope:Link
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
RX packets:19521 errors:0 dropped:0 overruns:0 frame:0
TX packets:17277 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3893186 (3.7 MiB)TXbytes:1690940 (1.6 MiB)
Interrupt:67 Base address:0x2000
[root@mysql data]# ifconfig eth0|grep 'inetaddr:'|sed 's/^.*addr://g'|sed 's/Bcast.*$//g'
192.168.126.128
範例2:更改test2.txt文件中tashi替換爲no;
[root@mysql data]# cat test2.txt
woshi 111
tashi 234
woshi 456
tashi 678
kajdklfjalskd
sdlkjflka
lksdjflkasd
[root@mysql data]# sed 's/tashi/no/g'test2.txt #具體命令操作方法。提示:如果想更改,需要加參數-n。
woshi 111
no 234
woshi 456
no 678
kajdklfjalskd
sdlkjflka
lksdjflkasd
範例3:替換文本中第一行第一個匹配的字符串。
[root@mysql ~]# cat test2.txt
woshi 111
tashi 234
woshi 456
tashi 678
[root@mysql ~]# sed '0,/woshi/ s/\(woshi \).*/\1999/'test2.txt
#剖析:
0,/woshi/:數字0表示從0-1取兩個匹配“/字符串/”的行,該參數需要結合s///g使用。使用位置最前方,表示提取並保留的行。
\(woshi\).*:匹配原有字符串,其中小括號需要轉義,因爲有空格符。“.*”表示有一個或多個字符。
\1999:其中“\1”代表替換,“\0”代表在原有字符串後累加。
woshi 999
tashi 234
woshi 456
tashi 678
其他範例:對文本中的數據進行技術統計。
[root@mysql data]# cat test3.txt
woshi 111
woshi 111
woshi 111
tashi 234
woshi 456
woshi 456
tashi 678
tashi 678
tashi 678
kajdklfjalskd
sdlkjflka
lksdjflkasd
[root@mysql data]# grep'[0-9]' test3.txt|sort -n |uniq -c
1 tashi 234
3 tashi 678
3 woshi 111
2 woshi 456
此博文僅爲學習筆記只用,還有很多不足,請大家指出。