sed及grep用法詳解

linux系統有被稱爲文本處理三劍客grepsedawk.

        今天與大家分享的就是gerpsed處理工具,至於awk,我將會在晚些的時間與大家分享,在分享grepsed之前我先要和大家說說正則表達,正則表達是什麼呢,正則表達式就像是三劍客手裏的劍,沒有劍哪還能稱的上什麼劍客,所以我們要先了解以下正則表達式的簡單用法。

什麼是正則表達式:

        “正則表達式是描述一組字符串特徵的模式,用來匹配特定的字符串。“--Ken Thompson

基本正則表達式的元字符有以下這些:

    . :匹配任意單個字符;

    []:匹配指定範圍內的任意單個字符;

      如:[a-z], [A-Z], [0-9], [a-z0-9]

       [:upper:]:所有大寫字母

       [:lower:]:所有小寫字母

       [:alpha:]:所有字母

       [:digit:]:所有數字

       [:alnum:]:所有的字母和數字

       [:space:]:所有空白字符

       [:punct:]:所有標點符號

       [^]:匹配指定範圍外的任意單個字符;

匹配次數:用在要指定其出現的次數的字符的後面,用於限制其前面字符出現的次數;默認工作於貪婪模式;

    *:匹配其前面的字符任意次;0,1,多次;

    .*:匹配任意長度的任意字符

    \?:匹配其前面的字符0次或1次;即其前面的字符是可有可無的;

    \+:匹配其前面的字符1次或多次;即其面的字符要出現至少1次;

    \{m\}:匹配其前面的字符m次;

    \{m,n\}:匹配其前面的字符至少m次,至多n次;

    \{0,n\}:至多n

    \{m,\}:至少m

位置錨定:

    ^:行首錨定;用於模式的最左側;

    $:行尾錨定;用於模式的最右側;

    ^PATTERN$:用於PATTERN來匹配整行;

    ^$:表示空白行;

    ^[[:space:]]*$:空行或包含空白字符的行;

    單詞:非特殊字符組成的連續字符(字符串)都稱爲單詞;

    \< \b:詞首錨定,用於單詞模式的左側;

    \> \b:詞尾錨定,用於單詞模式的右側;

    \<PATTERN\>:匹配完整單詞;

        好的現在可以介紹grepsed了,grepglobal searchregular expression(RE) and print out the line的縮寫,光看名字這麼長就知道這是一個很厲害的工具,嘿嘿,其實它能做到對用戶所選擇的過濾條件全文搜索匹配指定文件,並把相應的行顯示出來,並且顯示的是整行。也就是說只要有部分匹配就會整行顯示。這個過濾條件可以是基本正則表達式或擴展正則表達式。正則表達式我也將會在晚些的博客中與大家分享。

grep的用法

      grep[OPTIONS] PATTERN [FILE]...

      grep[OPTIONS] [-e PATTERN | -f FILE] [FILE...]

這裏的PATTERN就是過濾條件,加上-e參數後就可以匹配多個條件,後面的-f表示過濾條件可以從文件中讀取。

PATTERN:可以是由正則表達式的元字符及文本字符所編寫出的過濾條件。

 wKiom1Z-jgmjaqpnAAAXtvG7VVM790.png

常用選項如下:

      --color=[always|never|auto]:對提配到的文本是否高亮顯示;

      -iignore-case,忽略字符大小寫;

      -o:僅顯示匹配到的字符串本身,而不整行顯示;

      -v:顯示能被匹配字符所在的行以外的所有行;

      -E:支持擴展的正則表達式;

      -q:靜默模式,即匹配到字符,但不顯示,一般用來判斷文件是否存在;    

      -Anumnum用數字替換,表示顯示匹配到的字符所在的行及後num行;   -Bnumnum用數字替換,表示顯示匹配到的字符所在的行及前num行:

      -Cnumnum用數字替換,表示顯示匹配到的字符所在的行及前後各num行:

以下以-A選項爲例:

                            wKiom1Z-jk6S16XsAAAuikHAcQA040.png

grep需要和正則表達是才能發揮出威力,例如下面:

wKiom1Z-jomyN4qQAAAOeI8P2Xk028.png

例一:顯示/etc/passwd文件中以/bin/bash結尾的行;

 

wKioL1Z-jubSqg2qAAAPxqfFvv8448.png

例二:顯示netstat -tan命令的結果中以LISTEN後跟01或多個空白字符結尾的行

 

wKiom1Z-ju6QEnU0AAAUoWZ9dTc707.png

例三:顯示/etc/grub2.cfg文件中,以至少一個空白字符開頭,且爲數字結尾的行。


        grep的用法就說這麼多,基於正則表式還能組合出更多的用法,就大家研究去嘍,下面該說說sed了。

三劍客之sed


     sed是一個行編輯器,通常sed編輯文件都不是直接編輯原文件的,而是將原文件複製一份在內存中進行編輯,在sed啓動後內存空間中有一段空間pattern spacehold spacepattern space對複製來的文件進行逐行匹配,能被匹配到的我們就可以做指定編輯,sed可以對符合條件的行逐行編輯操作,也可以只對符合條件的部分進行編輯操作,處理完之後結果可以傳送到stdout(標準輸出),當然也可以選擇刪除,還可以選擇存放到hold space中,不能匹配到的可以選擇是否傳送到標準輸出。

關於sed用法:

      sed[OPTIONS] ...’script’ [input-file]...

           script:地址定界編輯命令,即對哪些文本,做什麼樣操作,注意地址定界和編輯命令之間沒有空格。

注意:不論是否被patternspace匹配到,默認情況下原文件都會被輸出到標準輸出。

wKioL1Z-j02TMoApAAALe0p-_eY427.png爲了測試我建立了這樣一個文本。

常用選項:

      -n:不輸出模式空間中的內容至屏幕;

      -escript, --expression=script:多點編輯;

      -f  /PATH/TO/SED_SCRIPT_FILE

           每行一個編輯命令,多個命令組成的文件叫做腳本文件

      -r,--regexp-extended:支持使用擴展正則表達式;

      -i[SUFFIX],--in-place[=SUFFIX]:直接編輯原文件


wKiom1Z-j4WCW9oQAAAHqdYVnok207.png

表示刪除test1文件行首爲12位數字開頭後面跟一個符號,並只顯示刪除後行中有cd字母的行。

 

地址定界:

(1)  空地址:對全文進行處理;

wKioL1Z-j8XyVGKuAAAMG3F0Ej4653.png

       (2) 單地址:

           #:指定行;

            /pattern/:被此模式所匹配到的每一行;

       (3) 地址範圍

           #,#

           #,+#

           #/pat1/

           /pat1/,/pat2/

           $:最後一行;

       (4) 步進:左邊數字爲其實行,右邊數字爲步長,即每次匹配加幾行如:1~2表示所有的奇數行。

      wKiom1Z-kBqBlI7BAAAIJH6hTB8309.png

編輯命令:

      d:刪除匹配模式匹配到的行;

      wKioL1Z-kFHzHTbKAAALdEWVhB8108.png

      p:顯示模式空間中的內容;

      wKiom1Z-kPjg4oLlAAANGWs5h4o743.png這裏第五行被顯示了兩遍,因爲默認情況下pattern space空間中的內容也是會被輸出的,-p之後又會被顯示一遍,所以這裏出現了兩次第五行的內容。

      a  \text:在行後面追加文本“text”,支持使用\n實現多行追加;

         wKiom1Z-kFPBABijAAAQ9zi0R1k670.png

      i  \text:在行前面插入文本“text”,支持使用\n實現多行插入;

      c  \text:把匹配到的行替換爲此處指定的文本“text”;

      w/PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;

      r  /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行後面;文件合併;

      wKiom1Z-kTOz2P7-AAAOy3xhPIU784.pngtest2文件中存放的就是wKioL1Z-kYHx-PcrAAACPM38J_A080.png

      =:爲模式匹配到的行打印行號;

      !:條件取反;

地址定界!編輯命令;

      s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等;

替換標記:

            g:全局替換;

            w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;

            p:顯示替換成功的行;

      wKiom1Z-kY_iQdrOAAAGBRGkk5E376.png

高級編輯命令:

h:把模式空間中的內容覆蓋至保持空間中;

H:把模式空間中的內容追加至保持空間中;

g:把保持空間中的內容覆蓋至模式空間中;

G:把保持空間中的內容追加至模式空間中;

x:把模式空間中的內容與保持空間中的內容互換;

n:覆蓋讀取匹配到的行的下一行至模式空間中;

N:追加讀取匹配到的行的下一行至模式空間中;

d:刪除模式空間中的行;

D:刪除多行模式空間中的所有行;

有興趣的可以自行研究研究。



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