unix-grep命令詳解

 

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\}\.'

發佈了21 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章