2,241 瀏覽數

Linux command – sed

透過 sed (Stream EDitor) 與 awk 都可以把文件做過濾和轉換成新的輸出內容.不過 sed 適合用於一整行的資料處理,而 awkhttp://benjr.tw/97139 則比較適合將一整行做多個 欄位 的資料處理.先來看看 sed 的幾個範例.

# sed [OPTION]... {script-only-if-no-other-script} [input-file]...

先產生一個文字檔當做 sed 過濾和轉換成範例.

root@ubuntu:~# ifconfig ens33 > ens33.txt
root@ubuntu:~# nl ens33.txt 
     1	ens33     Link encap:Ethernet  HWaddr 00:0c:29:3c:1c:8a  
     2	          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
     3	          inet6 addr: fe80::9500:4488:f396:fea3/64 Scope:Link
     4	          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     5	          RX packets:5125 errors:0 dropped:0 overruns:0 frame:0
     6	          TX packets:3127 errors:0 dropped:0 overruns:0 carrier:0
     7	          collisions:0 txqueuelen:1000 
     8	          RX bytes:3386373 (3.3 MB)  TX bytes:358734 (358.7 KB)

sed 常用參數

d

Delete pattern space
範例:刪除第2行

root@ubuntu:~# nl ens33.txt |sed '2d'
     1	ens33     Link encap:Ethernet  HWaddr 00:0c:29:3c:1c:8a  
     3	          inet6 addr: fe80::9500:4488:f396:fea3/64 Scope:Link
     4	          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     5	          RX packets:5125 errors:0 dropped:0 overruns:0 frame:0
     6	          TX packets:3127 errors:0 dropped:0 overruns:0 carrier:0
     7	          collisions:0 txqueuelen:1000 
     8	          RX bytes:3386373 (3.3 MB)  TX bytes:358734 (358.7 KB)

範例:刪除第2~5列

root@ubuntu:~# nl ens33.txt | sed -e '2,5d' 
     1	ens33     Link encap:Ethernet  HWaddr 00:0c:29:6d:a9:f0  
     6	          TX packets:6827 errors:0 dropped:0 overruns:0 carrier:0
     7	          collisions:0 txqueuelen:1000 
     8	          RX bytes:5276948 (5.2 MB)  TX bytes:914447 (914.4 KB)

a text

Append text which has each embedded newline preceded by a back‐slash \
範例:在第二行插入新字串

root@ubuntu:~# nl ens33.txt | sed '2a testing \
> testing'
     1	ens33     Link encap:Ethernet  HWaddr 00:0c:29:3c:1c:8a  
     2	          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
testing 
testing
     3	          inet6 addr: fe80::9500:4488:f396:fea3/64 Scope:Link
     4	          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     5	          RX packets:5125 errors:0 dropped:0 overruns:0 frame:0
     6	          TX packets:3127 errors:0 dropped:0 overruns:0 carrier:0
     7	          collisions:0 txqueuelen:1000 
     8	          RX bytes:3386373 (3.3 MB)  TX bytes:358734 (358.7 KB)

c text

Replace the selected lines with text (which has each embedded newline preceded by a backslash.
範例:使用新字串取代第二行到第五行

root@ubuntu:~# nl ens33.txt | sed '2,5c testing \
> testing'
     1	ens33     Link encap:Ethernet  HWaddr 00:0c:29:3c:1c:8a  
testing 
testing
     6	          TX packets:3127 errors:0 dropped:0 overruns:0 carrier:0
     7	          collisions:0 txqueuelen:1000 
     8	          RX bytes:3386373 (3.3 MB)  TX bytes:358734 (358.7 KB)

p

Print the current pattern space.
範例:顯示 2至5行,但其他的行還是會重覆顯示,需要加入參數 -n

root@ubuntu:~# nl ens33.txt | sed '2,5p'
     1	ens33     Link encap:Ethernet  HWaddr 00:0c:29:3c:1c:8a  
     2	          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
     2	          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
     3	          inet6 addr: fe80::9500:4488:f396:fea3/64 Scope:Link
     3	          inet6 addr: fe80::9500:4488:f396:fea3/64 Scope:Link
     4	          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     4	          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     5	          RX packets:5125 errors:0 dropped:0 overruns:0 frame:0
     5	          RX packets:5125 errors:0 dropped:0 overruns:0 frame:0
     6	          TX packets:3127 errors:0 dropped:0 overruns:0 carrier:0
     7	          collisions:0 txqueuelen:1000 
     8	          RX bytes:3386373 (3.3 MB)  TX bytes:358734 (358.7 KB)

用了參數 -n, –quiet, –silent , suppress automatic printing of pattern space

root@ubuntu:~# nl ens33.txt | sed -n '2,5p'
     2	          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
     3	          inet6 addr: fe80::9500:4488:f396:fea3/64 Scope:Link
     4	          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     5	          RX packets:5125 errors:0 dropped:0 overruns:0 frame:0

s/regexp/replacement/

Attempt to match regexp against the pattern space. If successful, replace that portion matched with replacement.
範例:使用 Receive 取代 RX 字串,但同一行有多個 RX 只會取代第一個符合的字串.如果要全部取代需要在最後面加入參數 g.

root@ubuntu:~# nl ens33.txt | sed 's/RX/Receive/g' 
     1	ens33     Link encap:Ethernet  HWaddr 00:0c:29:3c:1c:8a  
     2	          inet addr:172.16.15.129  Bcast:172.16.15.255  Mask:255.255.255.0
     3	          inet6 addr: fe80::9500:4488:f396:fea3/64 Scope:Link
     4	          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     5	          Receive packets:5125 errors:0 dropped:0 overruns:0 frame:0
     6	          TX packets:3127 errors:0 dropped:0 overruns:0 carrier:0
     7	          collisions:0 txqueuelen:1000 
     8	          Receive bytes:3386373 (3.3 MB)  TX bytes:358734 (358.7 KB)

如果沒有定義 replacement 就會變成刪除.

root@ubuntu:~# nl ens33.txt | sed 's/RX//g' 
root@ubuntu:~# nl ens33.txt | sed 's/RX//g' 
     1	ens33     Link encap:Ethernet  HWaddr 00:0c:29:6d:a9:f0  
     2	          inet addr:172.16.15.130  Bcast:172.16.15.255  Mask:255.255.255.0
     3	          inet6 addr: fe80::d486:b6ac:858e:5140/64 Scope:Link
     4	          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     5	           packets:11224 errors:0 dropped:0 overruns:0 frame:0
     6	          TX packets:6827 errors:0 dropped:0 overruns:0 carrier:0
     7	          collisions:0 txqueuelen:1000 
     8	           bytes:5276948 (5.2 MB)  TX bytes:914447 (914.4 KB)

-i-i[SUFFIX], –in-place[=SUFFIX]

Edit files in place (makes backup if SUFFIX supplied)
前面的範例都不會對原始檔案做變動,加入參數 -i 可以直接修改原始檔案內容並會保留原始檔案成為新檔案.

root@ubuntu:~# sed 's/RX/Receive/g' ens33.txt 
ens33     Link encap:Ethernet  HWaddr 00:0c:29:34:6a:05  
          inet addr:172.16.15.132  Bcast:172.16.15.255  Mask:255.255.255.0
          inet6 addr: fe80::7d8d:eeb6:e5ba:dae0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Receive packets:3825 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1966 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          Receive bytes:4043870 (4.0 MB)  TX bytes:251228 (251.2 KB)

root@ubuntu:~# cat ens33.txt 
ens33     Link encap:Ethernet  HWaddr 00:0c:29:34:6a:05  
          inet addr:172.16.15.132  Bcast:172.16.15.255  Mask:255.255.255.0
          inet6 addr: fe80::7d8d:eeb6:e5ba:dae0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3825 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1966 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4043870 (4.0 MB)  TX bytes:251228 (251.2 KB)

ens33.txt 原始檔案內容被修改了,並將原本檔案儲存成為 ens33.txt.bak

root@ubuntu:~# sed -i.bak 's/RX/Receive/g' ens33.txt 
root@ubuntu:~# cat ens33.txt 
ens33     Link encap:Ethernet  HWaddr 00:0c:29:34:6a:05  
          inet addr:172.16.15.132  Bcast:172.16.15.255  Mask:255.255.255.0
          inet6 addr: fe80::7d8d:eeb6:e5ba:dae0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Receive packets:3825 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1966 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          Receive bytes:4043870 (4.0 MB)  TX bytes:251228 (251.2 KB)

root@ubuntu:~# ll ens33.txt*
-rw-r--r-- 1 root root 501 Sep 27 21:08 ens33.txt
-rw-r--r-- 1 root root 501 Sep 27 21:08 ens33.txt.bak

One Reply to “Linux command – sed”

  1. 自動參照通知: Linux command – awk – Benjr.tw

發表迴響