Linux Shell常用技巧(二)

來源:互聯網
上載者:User

七. grep家族:
    
   1.  grep退出狀態:
    0: 表示成功;
    1: 表示在所提供的檔案無法找到匹配的pattern;
    2: 表示參數中提供的檔案不存在。
    見如下樣本:
    /> grep 'root' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    /> echo $?
    0
    
    /> grep 'root1' /etc/passwd  #使用者root1並不存在
    /> echo $?
    1
    
    /> grep 'root' /etc/passwd1  #這裡的/etc/passwd1檔案並不存在
    grep: /etc/passwd1: No such file or directory
    /> echo $?
    2
    
   2.  grep中應用Regex的執行個體:
    需要說明的是下面所涉及的Regex在上一篇中已經給出了詳細的說明,因此在看下面例子的時候,可以與前一篇的正則說明部分結合著看。
    /> cat testfile
    northwest        NW      Charles Main           3.0     .98     3       34
    western           WE       Sharon Gray          5.3     .97     5       23
    southwest       SW       Lewis Dalsass         2.7     .8       2       18
    southern         SO       Suan Chin               5.1     .95     4       15
    southeast       SE        Patricia Hemenway    4.0     .7       4       17
    eastern           EA        TB Savage              4.4     .84     5       20
    northeast        NE        AM Main Jr.              5.1     .94     3       13
    north              NO       Margot Weber          4.5     .89     5       9
    central            CT        Ann Stephens          5.7     .94     5       13

   
    /> grep NW testfile     #列印出testfile中所有包含NW的行。
    northwest       NW      Charles Main        3.0     .98     3       34
    
    /> grep '^n' testfile   #列印出以n開頭的行。
    northwest       NW      Charles Main        3.0     .98     3       34
    northeast        NE       AM Main Jr.          5.1     .94     3       13
    north              NO      Margot Weber      4.5     .89     5       9
    
    /> grep '4$' testfile   #列印出以4結尾的行。
    northwest       NW      Charles Main        3.0     .98     3       34
    
    /> grep '5\..' testfile #列印出第一個字元是5,後面跟著一個.字元,在後面是任一字元的行。
    western         WE      Sharon Gray         5.3     .97     5       23
    southern        SO      Suan Chin             5.1     .95     4       15
    northeast       NE      AM Main Jr.            5.1     .94     3       13
    central           CT      Ann Stephens        5.7     .94     5       13
    
    /> grep '\.5' testfile  #列印出所有包含.5的行。
    north           NO      Margot Weber        4.5     .89     5       9

    /> grep '^[we]' testfile #列印出所有以w或e開頭的行。
    western         WE      Sharon Gray         5.3     .97     5       23
    eastern          EA      TB Savage            4.4     .84     5       20
    
    /> grep '[^0-9]' testfile #列印出所有不是以0-9開頭的行。
    northwest       NW     Charles Main             3.0     .98      3       34
    western          WE      Sharon Gray             5.3     .97     5       23
    southwest       SW     Lewis Dalsass           2.7     .8       2       18
    southern         SO      Suan Chin                5.1     .95     4       15
    southeast        SE      Patricia Hemenway     4.0     .7      4       17
    eastern           EA      TB Savage                4.4     .84     5       20
    northeast        NE      AM Main Jr.                5.1     .94     3       13
    north              NO      Margot Weber           4.5     .89     5       9
    central            CT      Ann Stephens            5.7     .94     5       13

    /> grep '[A-Z][A-Z] [A-Z]' testfile #列印出所有包含前兩個字元是大寫字元,後面緊跟一個空格及一個大寫字母的行。
    eastern          EA      TB Savage       4.4     .84     5       20
    northeast       NE      AM Main Jr.      5.1     .94     3       13
    註:在執行以上命令時,如果不能得到預期的結果,即grep忽略了大小寫,導致這一問題的原因很可能是當前環境的本地化的設定問題。對於以上命令,如果我將當前語言設定為en_US的時候,它會列印出所有的行,當我將其修改為中文環境時,就能得到我現在的輸出了。
    /> export LANG=zh_CN  #設定當前的語言環境為中文。
    /> export LANG=en_US  #設定當前的語言環境為美國。
    /> export LANG=en_Br  #設定當前的語言環境為英國。
    
    /> grep '[a-z]\{9\}' testfile #列印所有包含每個字串至少有9個連續小寫字元的字串的行。
    northwest        NW      Charles Main          3.0     .98     3       34
    southwest       SW      Lewis Dalsass         2.7     .8       2       18
    southeast        SE      Patricia Hemenway   4.0     .7       4       17
    northeast        NE      AM Main Jr.              5.1     .94     3       13
    
    #第一個字元是3,緊跟著一個句點,然後是任意一個數字,然後是任意個任一字元,然後又是一個3,然後是定位字元,然後又是一個3,需要說明的是,下面正則中的\1表示\(3\)。
    /> grep '\(3\)\.[0-9].*\1    *\1' testfile
    northwest       NW      Charles Main        3.0     .98     3       34
    
    /> grep '\<north' testfile    #列印所有以north開頭的單詞的行。
    northwest       NW      Charles Main          3.0     .98     3       34
    northeast        NE       AM Main Jr.            5.1     .94     3       13
    north              NO      Margot Weber        4.5     .89     5       9
    
    /> grep '\<north\>' testfile  #列印所有包含單詞north的行。
    north           NO      Margot Weber        4.5     .89     5       9
    
    /> grep '^n\w*' testfile      #第一個字元是n,後面是任意字母或者數字。
    northwest       NW     Charles Main          3.0     .98     3       34
    northeast        NE      AM Main Jr.            5.1     .94     3       13
    north             NO      Margot Weber        4.5     .89     5       9
    
    3.  擴充grep(grep -E 或者 egrep):
    使用擴充grep的主要好處是增加了額外的Regex元字元集。下面我們還是繼續使用執行個體來示範擴充grep。
    /> egrep 'NW|EA' testfile     #列印所有包含NW或EA的行。如果不是使用egrep,而是grep,將不會有結果查出。
    northwest       NW      Charles Main        3.0     .98     3       34
    eastern         EA      TB Savage           4.4     .84     5       20
    
    /> grep 'NW\|EA' testfile     #對於標準grep,如果在擴充元字元前面加\,grep會自動啟用擴充選項-E。
    northwest       NW      Charles Main        3.0     .98     3       34
    eastern           EA       TB Savage           4.4     .84     5       20
    
    /> egrep '3+' testfile
    /> grep -E '3+' testfile
    /> grep '3\+' testfile        #這3條命令將會列印出相同的結果,即所有包含一個或多個3的行。
    northwest       NW      Charles Main         3.0     .98     3       34
    western          WE      Sharon Gray         5.3     .97     5       23
    northeast        NE       AM Main Jr.           5.1     .94     3       13
    central            CT       Ann Stephens       5.7     .94     5       13
    
    /> egrep '2\.?[0-9]' testfile
    /> grep -E '2\.?[0-9]' testfile
    /> grep '2\.\?[0-9]' testfile #首先含有2字元,其後緊跟著0個或1個點,後面再是0和9之間的數字。
    western         WE       Sharon Gray          5.3     .97     5       23
    southwest      SW      Lewis Dalsass         2.7     .8      2       18
    eastern          EA       TB Savage             4.4     .84     5       20
    
    /> egrep '(no)+' testfile
    /> grep -E '(no)+' testfile
    /> grep '\(no\)\+' testfile   #3個命令返回相同結果,即列印一個或者多個連續的no的行。
    northwest       NW      Charles Main        3.0     .98     3       34
    northeast        NE       AM Main Jr.          5.1     .94     3       13
    north              NO      Margot Weber      4.5     .89     5       9
    
    /> grep -E '\w+\W+[ABC]' testfile #首先是一個或者多個字母,緊跟著一個或者多個非字母數字,最後一個是ABC中的一個。
    northwest       NW     Charles Main       3.0     .98     3       34
    southern        SO      Suan Chin           5.1     .95     4       15
    northeast       NE      AM Main Jr.          5.1     .94     3       13
    central           CT      Ann Stephens      5.7     .94     5       13
    
    /> egrep '[Ss](h|u)' testfile
    /> grep -E '[Ss](h|u)' testfile
    /> grep '[Ss]\(h\|u\)' testfile   #3個命令返回相同結果,即以S或s開頭,緊跟著h或者u的行。
    western         WE      Sharon Gray       5.3     .97     5       23
    southern        SO      Suan Chin          5.1     .95     4       15
    
    /> egrep 'w(es)t.*\1' testfile    #west開頭,其中es為\1的值,後面緊跟著任意數量的任一字元,最後還有一個es出現在該行。
    northwest       NW      Charles Main        3.0     .98     3       34
   

    4.  grep選項:
    這裡先列出grep常用的命令列選項:

選項 說明
-c 只顯示有多少行匹配,而不具體顯示匹配的行。
-h 不顯示檔案名稱。
-i 在字串比較的時候忽略大小寫。
-l 只顯示包含匹配模板的行的檔案名稱清單。
-L 只顯示不包含匹配模板的行的檔案名稱清單。
-n 在每一行前面列印改行在檔案中的行數。
-v 反向檢索,只顯示不匹配的行。
-w 只顯示完整單詞的匹配。
-x 只顯示完整行的匹配。
-r/-R 如果檔案參數是目錄,該選項將遞迴搜尋該目錄下的所有子目錄和檔案。

    /> grep -n '^south' testfile  #-n選項在每一個匹配行的前面列印行號。
    3:southwest     SW      Lewis Dalsass         2.7     .8      2       18
    4:southern       SO      Suan Chin               5.1     .95     4       15
    5:southeast      SE      Patricia Hemenway    4.0     .7      4       17

    /> grep -i 'pat' testfile     #-i選項關閉了大小寫敏感。
    southeast       SE      Patricia Hemenway       4.0     .7      4       17

    /> grep -v 'Suan Chin' testfile #列印所有不包含Suan Chin的行。
    northwest       NW      Charles Main          3.0     .98     3       34
    western          WE      Sharon Gray           5.3     .97    5       23
    southwest       SW      Lewis Dalsass        2.7     .8      2       18
    southeast        SE      Patricia Hemenway   4.0     .7      4       17
    eastern           EA      TB Savage              4.4     .84     5       20
    northeast        NE      AM Main Jr.             5.1     .94     3       13
    north              NO      Margot Weber        4.5     .89     5       9
    central            CT      Ann Stephens         5.7     .94     5       13

    /> grep -l 'ss' testfile  #-l使得grep只列印匹配的檔案名稱,而不列印匹配的行。
    testfile

    /> grep -c 'west' testfile #-c使得grep只列印有多少匹配模板的行。
    3

    /> grep -w 'north' testfile #-w只列印整個單詞匹配的行。
    north           NO      Margot Weber    4.5     .89     5       9

    /> grep -C 2 Patricia testfile #列印匹配行及其上下各兩行。
    southwest      SW     Lewis Dalsass         2.7     .8       2       18
    southern        SO      Suan Chin              5.1     .95     4       15
    southeast       SE      Patricia Hemenway   4.0     .7      4       17
    eastern          EA      TB Savage              4.4     .84     5       20
    northeast       NE      AM Main Jr.             5.1     .94     3       13

    /> grep -B 2 Patricia testfile #列印匹配行及其前兩行。
    southwest      SW      Lewis Dalsass         2.7     .8      2       18
    southern        SO      Suan Chin               5.1     .95    4       15
    southeast       SE      Patricia Hemenway   4.0     .7      4       17

    /> grep -A 2 Patricia testfile #列印匹配行及其後兩行。
    southeast       SE      Patricia Hemenway   4.0     .7      4       17
    eastern           EA      TB Savage              4.4     .84     5       20
    northeast       NE       AM Main Jr.             5.1     .94     3       13

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.