grep一般格式爲:
grep [選項]基本正則表達式[文件]
這裏基本正則表達式可爲字符串。
單引號雙引號
在grep命令中輸入字符串參數時,最好將其用雙引號括起來。
在調用模式匹配時,應使用單引號。
例如:“m y s t r i n g”。這樣做有兩個原因,一是以防被誤解爲s h e l l命令,二是可以用來查找多個單詞組成的字符串。
在調用變量時,也應該使用雙引號,諸如: grep“$ MYVAR”文件名,如果不這樣,將沒有返回結果。
常用的grep選項有:
-c 只輸出匹配行的計數。
-i 不區分大小寫(只適用於單字符)。
-h 查詢多文件時不顯示文件名。
-l 查詢多文件時只輸出包含匹配字符的文件名。
-n 顯示匹配行及行號。
-s 不顯示不存在或無匹配文本的錯誤信息。
-v 顯示不包含匹配文本的所有行。
開始討論之前,先生成一個文件,插入一段文本,並在每列後加入<Tab>鍵,grep命令示例中絕大多數將以此爲例,其命名爲data.f。生成一個文件,data.f的記錄結構如下:
第1列:城市位置編號。
第2列:月份。
第3列:存儲代碼及出庫年份。
第4列:產品代號。
第5列:產品統一標價。
第6列:標識號。
第7列:合格數量。
文件內容如下:
$ cat data.f
48 Dec 3BC1977 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA1998 USP 37.00 KVM9D 644
216 sept 3ZL1998 USP 86.00 KVM9E 234
1、查詢多個文件
在所有文件中查詢單詞“ sort it”
$ grep "sort it" *
2、 行匹配
1)顯示包含“4 8”字符串的文本:
$ grep "48"data.f
2)輸出匹配行的總數
$ grep -c "48"data.f
4
grep返回數字4,表示:包含字符串“4 8”的有4行。
3)行數
顯示滿足匹配模式的所有行行數:
$ grep -n "48"data.f
行數在輸出第一列,後跟包含4 8的每一匹配行。
4)顯示非匹配行
顯示所有不包含4 8的各行
$ grep -v "48"data.f
5)精確匹配
可能大家已注意到,在上一例中,抽取字符串“48”,返回結果包含諸如484和483等包含“48”的其他字符串,實際上應精確抽取只包含48的各行。
使用grep抽取精確匹配的一種更有效方式是在抽取字符串後加\ >。假定現在精確抽取4 8,方法如下:
$grep "48\>" data.f
另一種方法我試過,好像不行:
注意在每個匹配模式中抽取字符串後有一個<tab>鍵,所以應操作如下:
<tab>表示點擊tab鍵。
$grep "48<tab>" data.f
6)大小寫敏感
缺省情況下,grep是大小寫敏感的,如要查詢大小寫不敏感字符串,必須使用- i開關。在data.f文件中有月份字符Sept,既有大寫也有小寫,要取得此字符串大小寫不敏感查詢,方法如下:
$grep -i "48" data.f
grep和正則表達式
使用正則表達式使模式匹配加入一些規則,因此可以在抽取信息中加入更多選擇。使用正則表達式時最好用單引號括起來,這樣可以防止grep中使用的專有模式與一些s h e l l命令的特殊方式相混淆。
1、模式範圍
抽取代碼爲4 8 4和4 8 3的城市位置,可以使用[ ]來指定字符串範圍。
$ grep "48[34]" data.f
483 Sept 5AP1996 USP 65.00 LVX2C 189
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA1998 USP 37.00 KVM9D 644
2、不匹配行首
使行首不是4或8,可以在方括號中使用^記號。
$ grep "^[^48]" data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
如果是字符串48
$ grep -v "^[^48]" data.f
3、設置大小寫
使用- i開關可以屏蔽月份S e p t的大小寫敏感
$ grep -i "sept" data.f
483 Sept 5AP1996 USP 65.00 LVX2C 189
216 sept 3ZL1998 USP 86.00 KVM9E 234
也可以用另一種方式[ ]模式抽取各行包含S e p t和s e p t的所有信息。
$ grep '[sS]ept' data.f
如果要抽取包含S e p t的所有月份,不管其大小寫,並且此行包含字符串483,可以使用管道命令,即符號“|”左邊命令的輸出作爲“ |”右邊命令的輸入。舉例如下:
$ grep '[sS]ept' data.f | grep 48
483 Sept 5AP1996 USP 65.00 LVX2C 189
不必將文件名放在第二個grep命令中,因爲其輸入信息來自於第一個grep命令的輸出
4、匹配任意字符
如果抽取以K開頭,以D結尾的所有代碼,可使用下述方法,因爲已知代碼長度爲5個字符:
$ grep 'K...D' data.f
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
483 may 5PA1998 USP 37.00 KVM9D 644
將上述代碼做輕微改變,頭兩個是大寫字母,中間兩個任意,並以C結尾:
$ grep '[A-Z]..C' data.f
483 Sept 5AP1996 USP 65.00 LVX2C 189
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
5、日期查詢
一個常用的查詢模式是日期查詢。先查詢所有以5開始以1 9 9 6或1 9 9 8結尾的所有記錄。使用模式5 . . 1 9 9 [ 6 , 8 ]。這意味着第一個字符爲5,後跟兩個點,接着是1 9 9,剩餘兩個數字是6或8。
$ grep '5..199[6,8]' data.f
483 Sept 5AP1996 USP 65.00 LVX2C 189
483 may 5PA1998 USP 37.00 KVM9D 644
6、範圍組合
必須學會使用[ ]抽取信息。假定要取得城市代碼,第一個字符爲0-9,第二個字符在0到5之間,第三個字符在0到6之間,使用下列模式即可實現。
$ grep '[0-9][0-5[0-6]' data.f
48 Dec 3BC1977 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA1998 USP 37.00 KVM9D 644
216 sept 3ZL1998 USP 86.00 KVM9E 234
這裏返回很多信息,有想要的,也有不想要的。參照模式,返回結果是正確的,因此這裏
$ grep '^[0-9][0-5][0-6]' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
這樣可以返回一個預期的正確結果。
7、模式出現機率
抽取包含數字4至少重複出現兩次的所有行,方法如下:
$ grep '4\{2,\}' data.f
483 may 5PA1998 USP 37.00 KVM9D 644
上述語法指明數字4至少重複出現兩次,注意有無邊界字符的區別。
同樣,抽取記錄使之包含數字9 9 9(三個9),方法如下:
$ grep '9\{3,\}' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
如果要查詢重複出現次數一定的所有行,語法如下,數字9重複出現兩次或三次:
$ grep '9\{3\}' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
$ grep '9\{2\}' data.f
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
有時要查詢重複出現次數在一定範圍內,比如數字或字母重複出現2到6次,下例匹配數字8重複出現2到6次,並以3結尾:
$ cat myfile
83
888883
8884
88883
$ grep '8\{2,6\}3' myfile
888883
88883
8、使用grep匹配“與”或者“或”模式
grep命令加- E參數,這一擴展允許使用擴展模式匹配。例如,要抽取城市代碼爲2 1 9或2 1 6,方法如下:
$ grep -E '219|216' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
9、空行
結合使用^和$可查詢空行。使用- c參數顯示總行數:
$ grep -c '^$' myfile
使用- n參數顯示實際在哪一行:
$ grep -c '^$' myfile
10、匹配特殊字符
查詢有特殊含義的字符,諸如$ . ' " * [] ^ | \ + ? ,必須在特定字符前加\。假設要查詢包含“.”的所有行,腳本如下:
$ grep '\.' myfile
或者是一個雙引號:
$ grep '\"' myfile
以同樣的方式,如要查詢文件名conftroll.conf(這是一個配置文件),腳本如下:
$ grep 'conftroll\.conf' myfile
11、查詢格式化文件名
使用正則表達式可匹配任意文件名。系統中對文本文件有其標準的命名格式。一般最多六個小寫字符,後跟句點,接着是兩個大寫字符。
$ grep '^[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename
12、查詢IP地址
要查看nnn.nnn網絡地址,如果忘了第二部分中的其餘部分,只知有兩個句點,例如n nn.nn..。要抽取其中所有nnn.nnn IP地址,使用[0-9]\{3\}\.[0-0\{3\}\。含義是任意數字出現3次,後跟句點,接着是任意數字出現3次,後跟句點。
[0-9]\{3\}\.[0-9]\{3\}\.'