Linux文本處理工具三劍客---sed

    sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。然後讀入下行,執行下一個循環。如果沒有使諸如‘D’的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件,簡化對文件的反覆操作,編寫轉換程序等。

    sed和文本處理工具vim、grep是有區別的,vim是一種交互式的文本編輯工具,而sed是一種非交互式的文本編輯器(通過給定的條件自動的逐行去處理文件);grep雖然也是一種流式的文本處理工具,但grep是用來檢索條件關鍵字的,而sed卻是搜索匹配處理文本工具。

    sed所具有的功能有:數據的替換、刪除、新增等,這裏的數據可以是一些關鍵字,也可以是一些特定的行。

1、sed的語法結構:

    sed [OPTION]... {script} {input-file}...{actions}

常用選項:

    -n:不輸出模式空間內容到屏幕,即不自動打印,即靜默模式
    -e script 1 -e script 2 -e script 3:指定多腳本運行
    -f:/PATH/SCRIPT_FILE: 從指定的文件中讀取腳本並運行
    -r:支持使用擴展正則表達式
    -i:備份文件並原處編輯;直接修改源文件
script: '地址命令'

2、sed的地址定界(抽取的域):
(1) 不給地址:對全文進行處理
(2) 單地址:
    #: 指定的行

    $:最後一行
    /pattern/:被此處模式所能夠匹配到的每一行

    %patten%:同上,只不過換作%爲邊界符

(3) 地址範圍:

startline,endline:

    #,#:從#行到#行

    #:#:表示數字,指定行

    #,+#:從#行開始,一直到向下的#行
    /pat1/,/pat2/:從第一次被/pat1/匹配到的行開始,到第一次被/pat2/匹配到的行結束,中間的所有行
    #,/pat1/:從#行開始,到第一次被/pat/所匹配的行結束,中間所有的行
(4) ~:步進
    1~2 奇數行
    2~2 偶數行

first~step:指定起始行,已經步長

3、sed的編輯命令

      d:刪除模式空間匹配的行,並立即啓用下一輪循環    
      p:打印當前模式空間內容,追加到默認輸出之後    
      a \text:在指定行後面追加文本,支持使用\n實現多行追加    
      i \text:在指定行前面插入文本,支持使用\n實現多行插入   
     c \text:用text替換匹配的單行或多行文本    
     w /path/somefile: 保存模式匹配的行至指定文件;把指定的內容另存爲/path/somefile路徑所指定的文件中    
     r /path/somefile:讀取指定文件的文本至模式空間中匹配到的行後;在文件的指定位置插入另一文件的所有內容,完成文件合併    
     =: 爲模式空間中的行打印行號    
     !:模式空間中匹配行取反處理
     s/regexp/replacement/:替換由regexp所匹配到的內容爲replacement(支持使用其他分隔符,如:s@@@,s###;條件是該分隔符在後面
的模式中沒有出現過),對於替換還有兩個後選項g和i,分別表示如下:
          替換標記:
            g:行內全局替換;
            i:不區分大小寫
             p:顯示替換成功的行
             w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中

示例:

(1)刪除/app/grub.conf文件中所有行的行首的空白字符

    sed 's/^[[:space:]]//' grub.conf

(2)刪除/app/grub.conf文件中所有以#開頭,後跟至少一個空白字符的行的行首的#和空白字符

    sed 's/^#[[:space:]]\+//g' /etc/fstab    

(3)把/app/grub.conf文件的奇數行另存爲/app/grub.conf.3

(4)echo 一個文件路徑給sed命令,取出其基名;進一步地,取出其路徑名;

    目錄名:echo '/etc/fstab' |sed -nr 's@(.*/)(.*$)@\1@p'
    基名:echo '/etc/fstab' |sed -nr 's@(.*/)(.*$)@\2@p'

4、sed的高級編輯命令

sed除了“模式空間”(patten space),還有一個“hold space”的內存空間,稱之爲保持空間。

sed工具支持一些高級的命令來運用到保持空間當中,高級命令有:

    P:打印模式空間開端至\n內容,並追加到默認輸出之前
    h: 把模式空間中的內容覆蓋至保持空間中
    H:把模式空間中的內容追加至保持空間中
    g: 從保持空間取出數據覆蓋至模式空間
    G:從保持空間取出內容追加至模式空間
    x: 把模式空間中的內容與保持空間中的內容進行互換
    n: 讀取匹配到的行的下一行覆蓋至模式空間
    N:讀取匹配到的行的下一行追加至模式空間
    d: 刪除模式空間中的行
    D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,並不會讀取新的輸入行,而使用合成的模式空間重新啓動循環。
            如果模式空間不包含換行符,則會像發出d命令那樣啓動正常的新循環

注意:命令功能可使用!分號可用於分隔腳本

示例:

seq 1 8 |sed -n 'n;p'  輸出偶數行
seq 1 10 |sed '1!G;h;$!d' 或 seq 1 10 |sed -n '1!G;h;$p' 倒序輸出
seq 1 10 |sed 'N;D' 或 seq 1 10 |sed '$!d' 只輸出最後一行
seq 1 10 |sed '$!N;$!D' 輸出倒數後兩行
seq 1 10 |sed 'G' 每行後加一個空行
seq 1 10 |sed 'g'  所有行變爲空行
cat seq.txt |sed '/^$/d;G' 空行刪除,每行後加一個空行,即保證每行後只有一個空行
seq 1 10 |sed 'n;d' 只顯示奇數行

5、收集的一些命令集:

    's/\.$//g'   刪除以句點結尾行
    '-e /abcd/d'  刪除包含abcd的行
    's/[][][]*/[]/g'  刪除1個以上空格用1個空格代替
    's/^[][]*//g' 刪除行首空格
    's/\.[][]*/[]/g'   刪除句點後跟2個或更多空格,以一個空格代替
    '/^$/d'   刪除空行
    's/^.//g'    刪除第一個字符
    's/COL\(...\)//g'  刪除緊跟COL的後三個字母
    's/^\///g'   從路徑中刪除第一個\
    's/[]/[]//g'  刪除所有空格並用tab鍵代替
    's/^[]//g'   刪除所有行首的tab鍵
    's/[]*//g'   刪除所有tab鍵

作業:
1、在centos6系統/root/install.log每一行行首增加#號
sed 's/^/#/g' /root/install.log           
2、在/etc/fstab文件中不以#開頭的行的行首增加#號
sed 's/^[^#]/#/' /etc/fstab
3、利用sed取出ifconfig命令中本機的IPv4地址
ifconfig |sed -nr '2s@^[[:blank:]]+inet[[:blank:]](([0-9]{1,3}\.){3}[0-9]{1,3}).+@\1@p'
4、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重複次數
ls /media/Packages/*.rpm |sed -r 's/.*\.(.+)\.rpm$/\1/' |sort |uniq -c
5、統計/etc/init.d/functions文件中每個單詞的出現次數,並排序(用grep和sed兩種方法分別實現)
cat /etc/init.d/functions |sed -r "s/[^[:alpha:]]/\n/g" |sort |uniq -c |sort -nr
6、將文本文件的n和n+1行合併爲一行,n爲奇數行
seq 10 | sed "1~2N; s/\n/ /"



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章