一文讀懂shell編程三劍客之一的sed命令

作為shell編程三劍客之一的sed,重要程度不言而喻。sed是一個流編程器,每次處理一行,處理完后再接著處理下一行,它支持正則,功能非常的強大。但sed比一般的命令復(fù)雜一些,選項繁多,想要掌握它是需要花點功夫的。下面我們通過眾多的例子來看看這個強大的sed命令的作用吧!

語法格式:sed [選項] [動作]

常用選項如下:

  • -n:sed默認會輸出所有stdin內(nèi)容,但加上該選項后,只顯示經(jīng)過sed處理過的行。

  • -e :允許在同一行里執(zhí)行多個動作

  • -f:從一個文件中讀取動作

  • -i:直接修改文件而不是輸入到屏幕上(危險)

動作中的參數(shù)及太多了,下面列一下:

  • a:在匹配行下面加入一行

  • c:將匹配的行修改新的內(nèi)容

  • d:刪除匹配的行

  • i:在匹配行前加入內(nèi)容

  • p:打印

  • s:替換匹配行的內(nèi)容

范例一:打印/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'

范例三:獲取服務(wù)器ip地址

這個案例非常的棒,建議大家仔細看看

#?ifconfig?eth0 eth0:?flags=4163<up>??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) ……</up>

我們需要的是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/.*inets+//g' 172.26.9.143??netmask?255.255.240.0??broadcast?172.26.15.255

接下來把ip地址后面的全部替換位空就行了

#?ifconfig?eth0?|?sed?-n?'/.*inet/p'?|?sed?'s/.*inets+//g'?|?sed?'s/s+.*//g' 172.26.9.143

下面我們來說說上面的例子,首先第一步我們使用了-n和p來獲取我們想要的行。然后,我們將不需要的信息進行過濾,需要注意的時,正則中s+表示至少匹配一個空格,但在這里需要在加號前使用轉(zhuǎn)義字符。

范例四

最后一個范例,我給出我昨天一個真實案例。需求是這樣的,獲取一段文本中的url地址,但不需要前面的http://。部分文本內(nèi)容如下:

??<td>?<a><font>北京</font></a> ?????<a><font>上海</font></a> ?????<a><font>天津</font></a> ?????<a><font>重慶</font></a> </td> <tr> <td> <b><font>山東</font>:</b>?</td> <td> ?<a><font>濟南</font></a> ?<a><font>青島</font></a><p>下面我們分幾步去完成該需求,首先,將不含url地址的行全部過濾</p> <pre class="brush:php;toolbar:false">#?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'

現(xiàn)在屏幕輸出的內(nèi)容如下

haikou.hellozx.com sanya.hellozx.com kunming.hellozx.com dali.hellozx.com xining.hellozx.com yinchuan.hellozx.com wulumuqi.hellozx.com ……

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊12 分享