next up previous contents
Next: sed 與 正規表示法 Up: sed 與 awk 工具 Previous: sed 與 awk 工具   Contents

sed 工具

  1. sed (stream editor) 可以分析 Standard Input (STDIN) 的資料,進行取代、刪除、新增、擷取特定行等處理後,再輸出到 standrad out (STDOUT)。
    [root@linux ~]# sed [-nefr] [動作]
    選項:
    -n  :使用安靜 (silent) 模式。在一般 sed 的用法中,所有來自 STDIN 
          的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則只有經過
          sed 特殊處理的那一行(或者動作)才會被列出來。
    -e  :直接在指令列模式上進行 sed 的動作編輯;
    -f  :-f filename 可以執行 filename 內的 sed 動作;
    -r  :sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
    -i  :直接修改讀取的檔案內容,而不是由螢幕輸出。
    
    動作說明:  [n1[,n2]]function
    n1, n2 :選擇進行動作的行數,例如,『10,20[動作行為] 』
    
    function:
    a   :新增, a 的後面可以接字串,這些字串會在目前的下一行出現。
    c   :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行。
    d   :刪除, d 後面通常不接任何字串;
    i   :插入, i 的後面可以接字串,這些字串會在目前的上一行出現;
    p   :列印,將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作。
    s   :取代,s 的動作可以搭配正規表示法。例如 1,20s/old/new/g 。
    
  2. 列出 /etc/passwd 的內容,並且列印行號,同時將第 2 5 行刪除。
    [root@linux ~]# nl /etc/passwd | sed '2,5d'
         1  root:x:0:0:root:/root:/bin/bash
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    .....(後面省略).....
    # sed 後面接的動作,務必以 '' 兩個單引號括住。
    # 如果只要刪除第 2 行,可以使用 nl /etc/passwd | sed '2d',
    # 刪除第 3 到最後一行,則是 nl /etc/passwd | sed '3,$d' 。
    
  3. 在第二行後加上『drink tea』字樣。
    [root@linux ~]# nl /etc/passwd | sed '2a drink tea'
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    drink tea
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
    # 如果要在第二行前? nl /etc/passwd | sed '2i drink tea'。
    
  4. 在第二行後面加入兩行字,例如『Drink tea or .....』『drink beer?』
    [root@linux ~]# nl /etc/passwd | sed '2a Drink tea or ......\
    > drink beer ?'
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    Drink tea or ......
    drink beer ?
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
    # 可以新增好幾行,但每一行之間都必須要以反斜線 \ 來進行新行的增加。
    
  5. 將第 2-5 行的內容取代成為『No 2-5 number』?
    [root@linux ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
         1  root:x:0:0:root:/root:/bin/bash
    No 2-5 number
         6  sync:x:5:0:sync:/sbin:/bin/sync
    
  6. 僅列出第 5-7 行
    [root@linux ~]# nl /etc/passwd | sed -n '5,7p'
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    # 沒有加 -n 參數時 sed '5,7p' ,5-7行會重複輸出。
    
  7. 使用 ifconfig 列出 IP ,若僅要 eth0 的 IP?
    [root@linux ~]# ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr 00:51:FD:52:9A:CA
              inet addr:192.168.1.12  Bcast:192.168.1.255  Mask:255.255.255.0
              inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    .....(以下省略).....
    # 只是 inet addr:..那一行,利用 grep 與 sed 來取
    [root@linux ~]# ifconfig eth0 | grep 'inet ' | sed 's/^.*addr://g' | \
    > sed 's/Bcast.*$//g'
    
  8. 將 /etc/man.config 檔案的內容中,有 MAN 的設定取出,且刪除註解說明。
    [root@linux ~]# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | \
    > sed '/^$/d'
    # 註解(以 # 開頭)不一定寫在第一個字元,所以必須使用正規表示法 #.*$ 。
    
  9. 利用 sed 直接在 ~/.bashrc 最後一行加入# This is a test
    [root@linux ~]# sed -i '$a # This is a test'  ~/.bashrc
    # -i 參數可以讓 sed 直接去修改後面接的檔案內容,而不是由螢幕輸出。
    # $a 則代表最後一行才新增。
    
  10. 利用 sed 刪除檔案 /tmp/man.config 第10行至最後一行,且將字串 man 改成 MAN
    [root@dywHome2 tmp]# sed -e '10,$d' -e 's/man/MAN/g' man.config
    #
    # Generated automatically from MAN.conf.in by the
    # configure script.
    #
    # MAN.conf from MAN-1.5m
    #
    # For more information about this file, see the MAN pages MAN(1)
    # and MAN.conf(5).
    #
    
    # 如果不加參數 -e,則無法同時完成上述刪除與取代命令。
    
  11. 若將上例刪除與取代命令編輯至檔案 ds.src,如何利用 sed 及 檔案 ds.src,執行同樣的命令?
    [root@dywHome2 tmp]# vi ds.src
    [root@dywHome2 tmp]# cat ds.src
    10,$d
    s/man/MAN/g
    [root@dywHome2 tmp]# sed -f ds.src man.config
    #
    # Generated automatically from MAN.conf.in by the
    # configure script.
    #
    # MAN.conf from MAN-1.5m
    #
    # For more information about this file, see the MAN pages MAN(1)
    # and MAN.conf(5).
    #
    
練習題
  1. sed 之功能為何?
    Sol. 分析 STDIN 的資料,進行取代、刪除、新增、擷取特定行等處理後,再輸出到 STDOUT。
  2. 如何以 nl 列出 /etc/passwd 的內容,同時將第 2 至 5 行刪除?
    Sol. nl /etc/passwd | sed '2,5d'
  3. 如何以 nl 列出 /etc/passwd 的內容,同時將第 2 行刪除?
    Sol. nl /etc/passwd | sed '2d'
  4. 如何以 nl 列出 /etc/passwd 的內容,同時將第 5 至 最後一行刪除?
    Sol. nl /etc/passwd | sed '5,$d'
  5. 如何以 nl 列出 /etc/passwd 的內容,同時在第五行後加上『new line』字樣?
    Sol. nl /etc/passwd | sed '5a new line'
  6. 如何以 nl 列出 /etc/passwd 的內容,同時在第五行前加上『new line』字樣?
    Sol. nl /etc/passwd | sed '5i new line'
  7. 若要以 nl 列出 /etc/passwd 的內容,同時在第五行後加上多行字,則行間必須如何區隔?
    Sol. 以反斜線 \ 來進行新行的增加。
  8. 如何以 nl 列出 /etc/passwd 的內容,同時將第 2-5 行的內容取代成為『No 2-5 number』?
    Sol. nl /etc/passwd | sed '2,5c No 2-5 number'
  9. 如何以 nl 列出 /etc/passwd 的內容,同時僅列出第 5-7 行?
    Sol. nl /etc/passwd | sed -n '5,7p'
  10. 若下指令 nl /etc/passwd | sed '5,7p',則第 5-7 行會如何顯示?
    Sol. sed 沒有加 -n 參數時,5-7 行會重複輸出。
  11. 如何使用 ifconfig 列出 IP,同時以 gerp 取出含有 inet 的行,再以 sed 將其他字串取代為空白字元,而僅留下 eth0 的 IP?
    Sol. ifconfig eth0 | grep 'inet ' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
  12. 如何將 /etc/man.config 檔案的內容中,有 MAN 的設定取出,且刪除註解說明?
    Sol. cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | sed '/^$/d'
  13. 如何利用 sed 直接在 ~/.bashrc 最後一行加入『# This is a test』?
    Sol. sed -i '$a # This is a test' ~/.bashrc
  14. 利用 sed 刪除檔案 /tmp/man.config 第10行至最後一行,且將字串 man 改成 MAN
    Sol. sed -e '10,$d' -e 's/man/MAN/g' man.config
  15. 檔案 ds.src 中有 sed 編輯命令,如何利用 ds.src 對檔案 /tmp/man.config,執行 sed 編輯?
    Sol. sed -f ds.src man.config


next up previous contents
Next: sed 與 正規表示法 Up: sed 與 awk 工具 Previous: sed 與 awk 工具   Contents
2017-06-14