2018-3-27Linux系統管理(15)sed命令

  在這一章中開始講述sed命令的基礎用法。正則表達式

1、闡述

  咱們此前也講過,Linux上的文本處理上的三劍客,分別是:express

   文本處理三劍客:
       grep, egrep, fgrep:文本過濾器;
       sed:Stream Editor, 流編輯器,行;相似於vim同樣的數據流編輯器,可是它是行編輯器。
       awk:文本格式化工具,報告生成器;

2、sed模式及命令用法

2.1 sed工做模式及原理

  剛纔咱們也提到過,sed是一個行編輯器,也就意味着sed只能處於一行文本,但sed與其它的文本處理的編輯工具同樣,默認都不直接去編輯源文件,而是將其原來的數據複製一份,在內存中執行編輯操做,假如說有一個文本文件,實際上同時可以處理多個文件,咱們以其中一個爲例,咱們知道的是每一個文本文件一般是由多行數據組成,sed在該文件中一次讀取出一行,而且放置到sed本身的工做車間內,並不會動源文件中的內容,只是將源文件其中的一行復製出來放置在本身專用的工做車間內進行加工,這個工做車間咱們稱之爲pattern space,咱們稱之爲模式空間,那麼讀取到一行以後,進行處理,其處理結果將會送到標準輸出stdoutvim

  默認狀況下,sed能夠針對該文件上每一行文本都能作出處理操做,可是咱們也可讓sed僅處理文本文件中所符合條件的行,所謂符合條件的行就是由正則表達式所匹配,也稱之爲文本過濾,那麼這樣就變成了另外一種從新描述的一種方式。sed每一次在文本中讀出一行文本,讀出來以後放置在pattern space的內存空間當中,放置在該內存空間中之後,sed不會執行其編輯操做,而是首先判斷是否讓sed所關注及匹配到的行,所謂sed關注到的行就是sed所給定的過濾模式,來看一下是否符合sed所給定的模式所匹配,若是是,則可以被匹配到,然後執行其編輯操做。稱之爲edit,將編輯到的結果能夠輸出至標準輸出。若是說sed讀取出來的行不能被sed所指定的pattern space可以匹配的話,那麼既然是匹配(pattern),就會有兩種結果:第一,可以被指定的pattern所匹配;第二,不可以被指定的pattern所匹配,若是沒法匹配成功時,則不進行任何編輯操做,而是直接默認輸出stdout。編輯器

  那麼若是獲取的數據能夠被sed指定的行由pattern所匹配到,那麼就可以進行編輯操做,那麼如何編輯,怎麼編輯,好比刪除、查找並替換字符串等操做,總之要進行編輯,然後將其編輯的結果輸出在stdout,固然,能夠不用輸出,由於有些結果可能沒有辦法進行輸出,這個是須要注意的地方,因此輸出對於編輯結構而言並非默認結構,由於有些編輯叫作刪除,那麼在大致上可以匹配的話,則能夠進行編輯,其編輯的結果能夠指明輸出至屏幕,若是不指定可能不會輸出的,可是若是不匹配的話,那麼其默認行爲就是標準輸出。ide

  可是咱們能夠明確指明,若是說不能被模式匹配到的行,不用輸出也能夠,它只是能夠默認輸出。因此說,sed大致上對於文本文件的編輯就剛纔像咱們所描述那些場景,每一次sed要逐行將文本文件中的內容讀取到pattern space中來,然後去判斷是否由模式操做進行匹配,可以被匹配到因而就採起編輯操做,若是不可以匹配,則默認不可以被模式空間中所匹配到的行的內容將其輸出到屏幕中來,但咱們能夠隱藏這種輸出,能夠表示不讓其輸出,依次類推,逐行進行匹配,那麼這就是sed大體的工做模式。工具

  但事實上sed仍是實現其強大的功能,這個強大的功能在於sed其內存內部中不只僅有模式空間,還有另外一個內存空間,稱之爲保持空間hold space,這也意味着,編輯完以後,放入pattern space,若是模式匹配到則進行編輯,而編輯完成以後放入保持空間中去,因此能夠玩一些魔數了,好比說讓保持空間和模式空間中的數據交換,但對於用戶來說幫助不大,咱們只需瞭解便可。因此咱們掌握最爲常見及廣泛的功能。spa

2.2 sed命令

  sed命令的使用格式也很是簡潔,sed後面能夠添加一些選項,後面能夠跟上一些腳本,而輸入文件有多個。意味着sed一次能夠處理多行文本。code

   sed [OPTION]... 'script' [input-file]...

  而script的組成格式的關鍵由兩個部分組成,第一個是地址定界,意思是從第幾行到第幾行,或者說是由第一個模式匹配到的行開始,到第一個被第二個模式所匹配到的行結束等,意思就是被行圈定以後,一旦被地址定界所匹配到以後,以後作出編輯,那麼第二個是編輯命令,而這兩個是要一塊兒來進行使用的,這就是地址定界+編輯命令來指出文原本作出其處理操做。regexp

    script:
        地址定界編輯命令

  那麼除了script以外,還有一些經常使用的option,然後再講它的地址定界機制和各類編輯命令。orm

    經常使用選項:
        -n:不輸出模式空間中的內容至屏幕;
        -e script, --expression=script:能夠指定一個sed命令中指定編輯多個腳本或多個編輯命令,也稱爲多點編輯;
        -f /PATH/TO/SED_SCRIPT_FILE:指明sed腳本編輯命令文件路徑;
            每行一個編輯命令:
        -r, --regexp-extended:支持使用擴展正則表達式;
        -i[SUFFIX], --in-place[=SUFFIX]:直接編輯源文件;

  將文本文件中的一行被讀到pattern space以後,該模式空間不管是否可以被編輯命令所匹配,一般而言都會將其輸出到屏幕中去,可是匹配以後還有第二種操做,就是edit,匹配到默認也是能夠輸出至stdout,可是也可被二種行爲edit進行編輯,編輯完成以後如何處理取決於用戶所輸入的編輯命令,一旦一行文本被讀到模式空間之後,它首先將模式空間中的內容輸出到屏幕上來,其次在判斷是否爲模式空間中的模式所匹配到,若是匹配到則能夠進行編輯,那麼若是不指望將模式空間中的內容輸出至屏幕中來的話,使用-n選項來禁用該功能。

2.3 地址定界

  地址定界就是專門用來講script當中如何指明對於那些行進行編輯,那麼這裏的地址定界方式與咱們以前講過的vim中的地址定界功能是類似的。

    地址定界:
        (1) 空地址;對全文進行處理;
        
        (2) 單地址;
            #:指定行;
            /PATTERN/:被此模式所匹配到的每一行;
            
        (3) 地址範圍
            #,#
            #,+#:從當前行開始,向下總共#行;
            #,/pat1/
            /pat1/,/pat2/
            
        (4) 步進:~
            1~2:全部奇數行;
            2~2:全部偶數行;

2.4 編輯命令

  接下來咱們講述一下sed經常使用的編輯命令。

   d:刪除(刪除模式空間中的內容);建議不要於-n使用
   p:顯示模式空間中的內容;
   a \text:在行後追加文本"text",支持使用\n實現多行追加;
   i \text:在行前插入文本"text",支持使用\n實現多行追加;
   c \text:把匹配到的行替換爲此處指定的文本"text";
   w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定文本中;
   r /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行處後面;文件合併;
   =:爲模式匹配到的行打印行號;
   !:條件取反;
      地址定界!編輯命令;
   s///:查找替換,其分隔符號可自行指定,經常使用的有:s@@@, s###等;
      替換標記:
         g:全局替換;
         w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
         p:顯示替換成功的行;

  示例1:將/etc/fstab文件中的1-5行進行刪除。

# sed '1,5d' /etc/fstab

  示例2:將奇數行顯示兩遍。在模式空間中默認編輯爲輸出。

# sed '1~2p' /etc/fstab

  示例3:顯示奇數行,或顯示偶數行。

# sed -n '1~2p' /etc/fstab
# sed '1~2d' /etc/fstab

  示例4:/etc/fstab第三行的前面插入一個"# Are You Ok?"的信息;而後在該行後面插入該信息。

# sed '3i \# Are You Ok?' /etc/fstab
# sed '3a \# Are You Ok?' /etc/fstab

  那麼咱們剛纔也講到過,它也支持多行文本插出,例如:

  示例5:在第三行的後面,在添加"# Are You Ok?"的同時,追加一行爲"# Hello Thank You!"的信息。

# sed '3a \# Are You Ok?\n# Hello Thank You!' /etc/fstab

  除了指定行號,還能夠指定其正則表達式的模式匹配。因此當有必要有些符合條件的內容加上一樣的註釋信息時,能夠實現用相似的方式來實現。

  示例6:匹配以UUID開頭的行,在該行的後面加上"# Thank You?"信息,然後追加一行爲"# Are You Ok?"的信息。

# sed '/^UUID/a \# Think You!\n# Are You Ok?' /etc/fstab

  示例7:將UUID開頭的行替換爲"# Are You Ok?"的信息。

# sed '/^UUID/c \# Are You Ok?' /etc/fstab

  示例8:咱們以UUID開頭的行另存爲/tmp/目錄下,取名爲fstab.new。

# sed -n '/^UUID/w /tmp/fstab' /etc/fstab.new

  示例9:在/etc/fstab文件下的第三行後插入/etc/issue文件中的內容。

# sed '3r /etc/issue' /etc/fstab

  示例10:取出非#號開頭的行。須要注意的是,要放置在條件的後面與命令以前。

# sed '/^#/!d' /etc/fstab

  示例11:將/etc/fstab文件中的#及空白字符所有刪除,同時也要刪除UUID開頭的行。

# sed -e 's@^#[[:space:]]*@@g' -e '/^UUID/d' /etc/fstab

3、高級編輯命令

  在這個高級編輯命令當中,雖然並不須要掌握,可是最起碼要了解一下。

   h:將模式空間中的內容覆蓋至保持空間中;
   H:將模式空間中的內容追加至保持空間中;
   g:將保持空間中的內容覆蓋至模式空間中;
   G:將保持空間中的內容追加至模式空間中;
   x:把模式空間中的內容於保持空間中的內容互換;
   n:覆蓋讀取匹配到的行的下一行至模式空間中;
   N:追加讀取匹配到的行的下一行至模式空間中;
   d:刪除模式空間中的行;
   D:刪除多行模式中間中的全部行;
相關文章
相關標籤/搜索