七. 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 $?
/> grep 'root1' /etc/passwd #使用者root1并不存在
1
/> grep 'root' /etc/passwd1 #這裡的/etc/passwd1檔案并不存在
grep: /etc/passwd1: No such file or directory
2
2. grep中應用正規表達式的執行個體:
需要說明的是下面所涉及的正規表達式在上一篇中已經給出了詳細的說明,是以在看下面例子的時候,可以與前一篇的正則說明部分結合着看。
/> 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開頭的行。
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
/> grep '4$' testfile #列印出以4結尾的行。
/> 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開頭的行。
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
/> 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的行。
/> 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的主要好處是增加了額外的正規表達式元字元集。下面我們還是繼續使用執行個體來示範擴充grep。
/> egrep 'NW|EA' testfile #列印所有包含NW或EA的行。如果不是使用egrep,而是grep,将不會有結果查出。
eastern EA TB Savage 4.4 .84 5 20
/> grep 'NW\|EA' testfile #對于标準grep,如果在擴充元字元前面加\,grep會自動啟用擴充選項-E。
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的行。
/> 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出現在該行。
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的行。
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
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 #列印比對行及其前兩行。
southern SO Suan Chin 5.1 .95 4 15
/> grep -A 2 Patricia testfile #列印比對行及其後兩行。
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13