天天看點

鳥哥sed知識補遺

鳥哥Sed知識補遺

格式 sed [-nefr] [n1,n2] 動作

-n 安靜模式,隻有經過sed處理過的行才顯示出來,其他不顯示。

-e 直接在指令行模式上進行sed的操作。貌似是預設選項,不用寫。

-f 将sed的操作寫在一個檔案裡,用的時候 -f filename 就可以按照内容進行sed操作了。

-r 使之支援擴充正規表達式

n1,n2 不一定需要, 選擇要進行處理的行, 10,20 表示在10~20行之間處理

動作

a 添加,接字元串,添加到目前行的下一行。

c 替換, 接字元串,用他們替換n1到n2之間的行。

d 删除符合模式的行 sed '/regexp/d'   // 之間是正規表達式,模式在d前面,d後面一般不接任何内容。

i 插入,接字元串,添加到目前行的上一行。

p 列印,列印某個選擇的資料,通常與-n 安靜模式一起使用

g 獲得記憶體緩沖區的内容,并替代目前模闆塊中的文本。

s 搜尋, 還可以替換,類似與vim裡的搜尋替換功能。例如 1,20s/old/new/g 替換1~20行的old為new

注意動作最好用' '括起來,防止空格導緻錯誤。

例子:

顯示 passwd内容,将2~5行删除顯示

woody@xiaoc:~/tmp$ cat -n /etc/passwd |sed ‘2,5d’

     1    root:x:0:0:root:/root:/bin/bash

     6    games:x:5:60:games:/usr/games:/bin/sh

     7    man:x:6:12:man:/var/cache/man:/bin/sh

     8    lp:x:7:7:lp:/var/spool/lpd:/bin/sh

............

在第二行後面一行加上Hello China 字元串

woody@xiaoc:~/tmp$ cat -n /etc/passwd |sed '2a Hello China!'

     2    daemon:x:1:1:daemon:/usr/sbin:/bin/sh

Hello China!

......

在第二行後面一行加上兩行字,例如 "this is first line!" "this is second line!"

woody@xiaoc:~/tmp$ cat -n /etc/passwd |sed '2a This is first line! \         //使用續航符\後按回車輸入後續行

> This is second line!'     // 以' 再回車結束

This is first line! 

This is second line!

     3    bin:x:2:2:bin:/bin:/bin/sh

将2~5行内容替換成 我是大好人!

woody@xiaoc:~/tmp$ cat -n /etc/passwd | sed '2,5c 我是大好人!'

我是大好人!

隻顯示5~7行, 注意p 與-n 配合使用!

woody@xiaoc:~/tmp$ cat -n /etc/passwd |sed -n '5,7p'

     5    sync:x:4:65534:sync:/bin:/bin/sync

使用ifconfig 列出IP, 我們隻想要 eth0的 IP位址

可以這樣,先用grep 取出有IP的那一行,然後用sed去掉(替換成空) IP前面和後面的内容。

woody@xiaoc:~/tmp$ ifconfig eth0

eth0      Link encap:Ethernet HWaddr 00:16:36:02:41:aa 

          inet addr:172.30.171.35 Bcast:172.30.171.255 Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

          RX packets:1221198 errors:0 dropped:0 overruns:0 frame:0

          TX packets:1125085 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:1477365271 (1.3 GB) TX bytes:141539593 (134.9 MB)

          Interrupt:20 

woody@xiaoc:~/tmp$ ifconfig eth0 | grep inet |sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

172.30.171.35 

woody@xiaoc:~/tmp$ 

'^.*addr:' 表示 從開頭到addr:的字元串,将它替換為空, 'Bcast.*$' 表示從Bcast到結尾的串,替換為空,

則剩下IP了!

在/etc/manpath.config中,将有MAN的設定取出,但不要說明内容。

woody@xiaoc:~/tmp$ cat /etc/manpath.config |grep 'MAN'|sed 's/#.*$//g'|sed '/^$/d'

MANDATORY_MANPATH            /usr/man

MANDATORY_MANPATH            /usr/share/man

MANDATORY_MANPATH            /usr/local/man

MANPATH_MAP    /bin            /usr/share/man

MANPATH_MAP    /usr/bin        /usr/share/man

MANPATH_MAP    /sbin            /usr/share/man

MANPATH_MAP    /usr/sbin        /usr/share/man

...........

注意#不一定出現在行首。 是以 /#.*$/ 表示 #和後面的資料直到行尾,即一行注釋,将他們替換成空

/^$/ 表示空行,後接d 表示删除空行。

注意删除空行不能用替換方法,因為空行替換成空後,還是有換行符在那一行。

本文轉自奔跑在路上部落格51CTO部落格,原文連結http://blog.51cto.com/qiangsh/1619248如需轉載請自行聯系原作者

qianghong000