作為shell程式三劍客之一的sed,重要程度不言而喻。 sed是一個串流程式設計器,每次處理一行,處理完後再接著處理下一行,它支援正規,功能非常的強大。但sed比一般的命令複雜一些,選項繁多,想要掌握它是需要花點功夫的。下面我們透過眾多的例子來看看這個強大的sed指令的作用吧!
語法格式:sed [選項] [動作]
常用選項如下:
-n:sed預設會輸出所有stdin內容,但加上此選項後,只顯示經過sed處理的行。
-e :允許在同一行執行多個動作
-f:從一個檔案中讀取動作
#-i:直接修改文件而不是輸入到螢幕上(危險)
#動作中的參數及太多了,下面列一下:
a:在符合行下方加入一行
c:將符合的行修改新的內容
d:刪除符合的行
i:在符合行前加入內容
p:列印
#s:取代符合行的內容
範例一:列印/etc/passwd檔案的第5-10行
# sed -n '5,10p' /etc/passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
範例二:刪除/etc/passwd檔案的第2行,第2到10行
# cat -n /etc/passwd | sed '2d' | sed '5,10d'
除了上面的方法,我們也可以用-e選項來完成
# cat -n /etc/passwd | sed -e '2d' -e '5,10d'
範例三:取得伺服器ip位址
這個案例非常的棒,建議大家仔細看看
# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.26.9.143 netmask 255.255.240.0 broadcast 172.26.15.255 ether 00:16:3e:0a:01:ad txqueuelen 1000 (Ethernet) ……
我們需要的是172.26.9.143。
第一步,取得我們想要處理的行
# ifconfig eth0 | sed -n '/.*inet/p' inet 172.26.9.143 netmask 255.255.240.0 broadcast 172.26.15.255
第二步,將不需要的資訊給替換位元空白字元
# ifconfig eth0 | sed -n '/.*inet/p' | sed 's/.*inet\s\+//g' 172.26.9.143 netmask 255.255.240.0 broadcast 172.26.15.255
接下來把ip位址後面全部的替換位空就行了
# ifconfig eth0 | sed -n '/.*inet/p' | sed 's/.*inet\s\+//g' | sed 's/\s\+.*//g' 172.26.9.143
下面我們來說說上面的例子,首先第一步我們使用了-n和p來取得我們想要的行。然後,我們將不需要的資訊進行過濾,需要注意的時,正則中\s 表示至少匹配一個空格,但在這裡需要在加號前使用轉義字元\。
範例四
最後一個範例,我給我昨天一個真實案例。需求是這樣的,取得一段文字中的url位址,但不需要前面的http://。部分文字內容如下:
<td width=820> <a href=http://beijing.hellozx.com onclick="co('beijing')"><font color="red">北京</font></a> <a href=http://shanghai.hellozx.com onclick="co('shanghai')"><font color="red">上海</font></a> <a href=http://tianjin.hellozx.com onclick="co('tianjin')"><font color="red">天津</font></a> <a href=http://chongqing.hellozx.com onclick="co('chongqing')"><font color="red">重庆</font></a></td></tr> <tr><td width=80 height=30 align=right> <b><font style="font-size:14px;">山东</font>:</b> </td><td width=820> <a href="http://jinan.hellozx.com" onclick="co('jinan')"><font color=red style="font-size:14px;">济南</font></a> <a href="http://qingdao.hellozx.com" onclick="co('qingdao')"><font color=red style="font-size:14px;">青岛</font></a>
下面我們分幾步去完成該需求,首先,將不含url位址的行全部過濾
# sed -n '/http:/p' a.txt
然後,將不需要的資訊全部替換位空白字元即可。先把http://及之前字元全部刪除
sed -n '/http:/p' a.txt | sed 's/.*http:\/\///g'
,接著把雙引號及之後字元全部刪除
# sed -n '/http:/p' a.txt | sed 's/.*http:\/\///g' | sed 's/".*//g'
現在螢幕輸出的內容如下
haikou.hellozx .com sanya.hellozx.com kunming.hellozx.com dali.hellozx.com xining.hellozx.com yinchuan.hellozx.com wulumuqi.hellozx.com …
以上是一文讀懂shell程式設計三劍客之一的sed指令的詳細內容。更多資訊請關注PHP中文網其他相關文章!