<b>2.4.1 sed的基礎文法格式</b>
sed的文法格式如下所示:
sed [-nefr]
[n1,n2] 動作
其中:
-n是安靜模式,隻有經過sed處理過的行才會顯示出來,其他不顯示。
-e表示直接在指令行模式上進行sed的操作。貌似是預設選項,不用寫。
-f将sed的操作寫在一個檔案裡,用的時候 -f filename 就可以按照内容進行sed操作了。
-r表示使sed支援擴充正規表達式。
-i表示直接修改讀取的檔案内容,而不是輸出到終端。
n1,n2表示選擇要進行處理的行,不是必需的。10,20表示在10~20行之間處理。
sed格式中的動作支援如下參數。
a:表示添加,後接字元串,添加到目前行的下一行。
c:表示替換,後接字元串,用它替換n1到n2之間的行。
d:表示删除符合模式的行,它的文法為sed '/regexp/d',//之間是正規表達式,模式在d前面,d後面一般不接任何内容。
i:表示插入,後接字元串,添加到目前行的上一行。
p:表示列印,列印選擇的某個資料,通常與-n(安靜模式)一起使用。
s:表示搜尋,還可以替換,類似于vim裡的搜尋替換功能。例如:“1,20s/old/new/g”表示将1~20行的old替換為new,g在這裡表示處理這一行所有比對的内容。
動作最好用' '括起來,防止因空格導緻錯誤。
sed的基礎執行個體如下(下面的所有執行個體在centos 6.4 x86_64下已認證,這裡提前将/etc/passwd拷貝到/tmp目錄下)。
1)顯示 passwd内容,将2~5行删除後顯示,指令如下所示:
cat -n
/tmp/passwd |sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11 operator:x:11:0:operator:/root:/sbin/nologin
12 games:x:12:100:games:/usr/games:/sbin/nologin
13 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
14 ftp:x:14:50:ftp
user:/var/ftp:/sbin/nologin
15 nobody:x:99:99:nobody:/:/sbin/nologin
16 vcsa:x:69:69:virtual
console memory owner:/dev:/sbin/nologin
17 saslauth:x:499:76:"saslauthd
user":/var/empty/saslauth:/sbin/nologin
18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19 sshd:x:74:74:privilege-separated
ssh:/var/empty/sshd:/sbin/nologin
20 puppet:x:52:52:puppet:/var/lib/puppet:/sbin/nologin
21 ntp:x:38:38::/etc/ntp:/sbin/nologin
22 nagios:x:500:500::/home/nagios:/bin/bash
23 apache:x:48:48:apache:/var/www:/sbin/nologin
24 nginx:x:498:499:nginx
user:/var/cache/nginx:/sbin/nologin
2)在第2行後面的一行加上“hello,world”字元串,指令如下所示:
/tmp/passwd |sed '2a hello,world'
顯示結果如下所示:
2 bin:x:1:1:bin:/bin:/sbin/nologin
hello,world
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
21 ntp:x:38:38::/etc/ntp:/sbin/nologin
3)在第2行後面一行加上兩行字,例如:“this is first line!”和 “this is second line!”,指令如下所示:
/tmp/passwd |sed '2a this is first line! \
//使用續航符\後按回車輸入後續行
> this is
second line!' // 以' 再回車結束
this is first
line!
this is second
4)将2~5行的内容替換成“i am a
good man!”,指令如下所示:
/tmp/passwd | sed '2,5c i am a good man!'
i am a good man!
5)隻顯示5~7行,注意p 與-n的配合使用,指令如下所示:
/etc/passwd |sed -n '5,7p'
6)使用ifconfig列出ip,我們隻想要eth0的ip位址,是以可以先用ifconfig eth0檢視網卡eth0的位址,指令如下所示:
ifconfig eth0
eth0 link encap:ethernet hwaddr 00:16:3e:7f:67:c3
inet addr:192.168.1.207 bcast:192.168.1.255 mask:255.255.255.0
inet6 addr:
fe80::216:3eff:fe7f:67c3/64 scope:link
up broadcast running multicast mtu:1500
metric:1
rx packets:11168717 errors:0
dropped:0 overruns:0 frame:0
tx packets:83863 errors:0 dropped:0
overruns:0 carrier:0
collisions:0 txqueuelen:1000
rx bytes:659653034 (629.0 mib) tx bytes:36972729 (35.2 mib)
interrupt:24
lo link encap:local loopback
inet addr:127.0.0.1 mask:255.0.0.0
inet6 addr: ::1/128 scope:host
up loopback running mtu:16436
rx packets:34 errors:0 dropped:0
overruns:0 frame:0
tx packets:34 errors:0 dropped:0
collisions:0 txqueuelen:0
rx bytes:2716 (2.6 kib) tx bytes:2716 (2.6 kib)
我們可以先用grep 取出有ip的那一行,然後用sed去掉(替換成空)ip前面和後面的内容,指令如下所示:
ifconfig eth0 |
grep "inet addr" | sed 's/^.*addr://g' | sed 's/bcast.*$//g'
指令顯示結果如下所示:
172.30.171.35
這裡解釋下這行組合指令:
grep 後面緊跟"inet addr"是為了單獨捕獲包含ipv4的那行内容;'^.*addr:' 表示從開頭到addr:的字元串,将它替換為空;'bcast.*$'
表示從bcast到結尾的串,也将它替換為空,然後就隻剩下ipv4位址。
另外一種更簡便的方法是使用awk,指令如下所示:
grep "inet addr:"|awk -f[:" "]+ '{print $4}'
192.168.1.207
awk -f[:"
"]的意思就是以“:”或空格符作為分隔符,然後列印出第4列,這裡有些朋友可能會有疑惑:為什麼不直接以如下方法來擷取ip呢:
grep "inet addr:" | awk -f: '{print $2}'
大家可以看下結果,得出的結果是:
192.168.1.207 bcast
是以還需要再進行一步操作,如下:
grep "inet addr:" | awk -f: '{print $2}' | awk '{print $1}'
希望大家通過這個例子好好總結一下sed的經典用法,第二種方法其實是awk的方法,awk也是一種優秀的編輯器,現多用于截取文本字段的列。
7)在/etc/man.config中,将有man的設定取出,但不要說明内容。指令如下所示:
cat
/etc/man.config |grep 'man'|sed 's/#.*$//g'|sed '/^$/d'
manpath /usr/man
manpath /usr/share/man
manpath /usr/local/man
manpath /usr/local/share/man
manpath /usr/x11r6/man
manpath_map /bin /usr/share/man
manpath_map /sbin /usr/share/man
manpath_map /usr/bin /usr/share/man
manpath_map /usr/sbin /usr/share/man
manpath_map /usr/local/bin /usr/local/share/man
manpath_map /usr/local/sbin /usr/local/share/man
manpath_map /usr/x11r6/bin /usr/x11r6/man
manpath_map /usr/bin/x11 /usr/x11r6/man
manpath_map /usr/bin/mh /usr/share/man
mansect 1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x
注意,#不一定要出現在行首。 是以,/#.*$/表示#和後面的資料(直到行尾)是一行注釋,将它們替換成空。/^$/ 表示空行,後接d 表示删除空行。
删除空行不能用替換方法,因為空行替換成空後,還是有換行符在那一行中。
以上就是sed的幾種常見的文法指令,希望大家結合下面的執行個體,多在自己的機器上演練,以盡快熟練掌握其用法。