首頁  >  文章  >  運維  >  一文讀懂shell程式設計三劍客之一的sed指令

一文讀懂shell程式設計三劍客之一的sed指令

齐天大圣
齐天大圣原創
2020-09-17 17:27:451747瀏覽

作為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 &#39;/.*inet/p&#39;
        inet 172.26.9.143  netmask 255.255.240.0  broadcast 172.26.15.255

第二步,將不需要的資訊給替換位元空白字元

# ifconfig eth0 | sed -n &#39;/.*inet/p&#39; | sed &#39;s/.*inet\s\+//g&#39;
172.26.9.143  netmask 255.255.240.0  broadcast 172.26.15.255

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

# ifconfig eth0 | sed -n &#39;/.*inet/p&#39; | sed &#39;s/.*inet\s\+//g&#39; | sed &#39;s/\s\+.*//g&#39;
172.26.9.143

下面我們來說說上面的例子,首先第一步我們使用了-n和p來取得我們想要的行。然後,我們將不需要的資訊進行過濾,需要注意的時,正則中\s 表示至少匹配一個空格,但在這裡需要在加號前使用轉義字元\。

範例四

最後一個範例,我給我昨天一個真實案例。需求是這樣的,取得一段文字中的url位址,但不需要前面的http://。部分文字內容如下:

  <td width=820> <a href=http://beijing.hellozx.com onclick="co(&#39;beijing&#39;)"><font color="red">北京</font></a>
     <a href=http://shanghai.hellozx.com onclick="co(&#39;shanghai&#39;)"><font color="red">上海</font></a>
     <a href=http://tianjin.hellozx.com onclick="co(&#39;tianjin&#39;)"><font color="red">天津</font></a>
     <a href=http://chongqing.hellozx.com onclick="co(&#39;chongqing&#39;)"><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(&#39;jinan&#39;)"><font color=red style="font-size:14px;">济南</font></a>
 <a href="http://qingdao.hellozx.com" onclick="co(&#39;qingdao&#39;)"><font color=red style="font-size:14px;">青岛</font></a>

下面我們分幾步去完成該需求,首先,將不含url位址的行全部過濾

# sed -n &#39;/http:/p&#39; a.txt

然後,將不需要的資訊全部替換位空白字元即可。先把http://及之前字元全部刪除

sed -n &#39;/http:/p&#39; a.txt | sed &#39;s/.*http:\/\///g&#39;

,接著把雙引號及之後字元全部刪除

# sed -n &#39;/http:/p&#39; 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn