Linux shell grep指令
grep一般格式為: www.2cto.com
grep [選項]基本正則表達式[文件]
這裡基本正則表達式可為字符串。
單引號雙引號
在g r e p命令中輸入字符串參數時,最好將其用雙引號括起來。
在調用模式匹配時,應使用單引號。
例如:“m y s t r i n g”。這樣做有兩個原因,一是以防被誤解為s h e l l命令,二是可以用來查找多個單詞組成的字符串。
在調用變量時,也應該使用雙引號,諸如: g r e p“$ M Y VA R”文件名,如果不這樣,將沒有返回結果。
常用的g r e p選項有: www.2cto.com
-c 只輸出匹配行的計數。
-i 不區分大小寫(只適用於單字符)。
-h 查詢多文件時不顯示文件名。
-l 查詢多文件時只輸出包含匹配字符的文件名。
-n 顯示匹配行及行號。
-s 不顯示不存在或無匹配文本的錯誤信息。
-v 顯示不包含匹配文本的所有行。
舉例:
1、查詢多個文件
在所有文件中查詢單詞“ sort it”
$ grep "sort it" *
2、 行匹配
1)顯示包含“4 8”字符串的文本:
$ grep "48" data.f
2)輸出匹配行的總數
$ grep -c "48" data.f
4
3)行數
顯示滿足匹配模式的所有行行數:
$ grep -n "48" data.f
行數在輸出第一列,後跟包含4 8的每一匹配行。
4)顯示非匹配行
$ grep -v "48" data.f
5)精確匹配
可能大家已注意到,在上一例中,抽取字符串“ 4 8”,返回結果包含諸如4 8 4和4 8 3等包含“4 8”的其他字符串,實際上應精確抽取只包含4 8的各行。
使用g r e p抽取精確匹配的一種更有效方式是在抽取字符串後加\ >。假定現在精確抽取4 8,方法如下:
$grep "48\>" data.f
6)大小寫敏感
缺省情況下, g r e p是大小寫敏感的,如要查詢大小寫不敏感字符串,必須使用- i開關。在d a t a . f文件中有月份字符S e p t,既有大寫也有小寫,要取得此字符串大小寫不敏感查詢,方法如下:
$grep -i "48" data.f
1、模式范圍
抽取代碼為4 8 4和4 8 3的城市位置,可以使用[ ]來指定字符串范圍。
$ grep "48[34]" data.f
2、不匹配行首
使行首不是4或8,可以在方括號中使用^記號。
$ grep "^[^48]" data.f
如果是字符串48
$ grep -v "^[^48]" data.f
3、設置大小寫
使用- i開關可以屏蔽月份S e p t的大小寫敏感
$ grep -i "sept" data.f
也可以用另一種方式[ ]模式抽取各行包含S e p t和s e p t的所有信息。
$ grep '[sS]ept' data.f
如果要抽取包含S e p t的所有月份,不管其大小寫,並且此行包含字符串483,可以使用管道命令,即符號“|”左邊命令的輸出作為“ |”右邊命令的輸入。舉例如下:
[sam@chenwy sam]$ grep '[sS]ept' data.f | grep 48
483 Sept 5AP1996 USP 65.00 LVX2C 189
4、匹配任意字符
如果抽取以K開頭,以D結尾的所有代碼,可使用下述方法,因為已知代碼長度為5個字符:
[sam@chenwy sam]$ grep 'K...D' data.f
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
483 may 5PA1998 USP 37.00 KVM9D 644
將上述代碼做輕微改變,頭兩個是大寫字母,中間兩個任意,並以C結尾:
[sam@chenwy sam]$ grep '[A-Z]..C' data.f
5、日期查詢
一個常用的查詢模式是日期查詢。先查詢所有以5開始以1 9 9 6或1 9 9 8結尾的所有記錄。使用模式5 . . 1 9 9 [ 6 , 8 ]。這意味著第一個字符為5,後跟兩個點,接著是1 9 9,剩余兩個數字是6或8。
[sam@chenwy sam]$ grep '5..199[6,8]' data.f
6、范圍組合
必須學會使用[ ]抽取信息。假定要取得城市代碼,第一個字符為0-9,第二個字符在0到5之間,第三個字符在0到6之間,使用下列模式即可實現。
[sam@chenwy sam]$ grep '[0-9][0-5[0-6]' data.f
7、模式出現機率
抽取包含數字4至少重復出現兩次的所有行,方法如下
[sam@chenwy sam]$ grep '4\{2,\}' data.f
8、使用grep匹配“與”或者“或”模式
g r e p命令加- E參數,這一擴展允許使用擴展模式匹配。例如,要抽取城市代碼為2 1 9或2 1 6,方法如下:
[sam@chenwy sam]$ grep -E '219|216' data.f
9、空行
結合使用^和$可查詢空行。使用- c參數顯示總行數:
[sam@chenwy sam]$ grep -c '^$' myfile
使用- n參數顯示實際在哪一行:
[sam@chenwy sam]$ grep -n '^$' myfile
10、匹配特殊字符
查詢有特殊含義的字符,諸如$ . ' " * [] ^ | \ + ? ,必須在特定字符前加\。假設要查詢包含“.”的所有行,腳本如下:
[sam@chenwy sam]$ grep '\.' myfile
或者是一個雙引號:
[sam@chenwy sam]$ grep '\"' myfile
以同樣的方式,如要查詢文件名c o n f t r o l l . c o n f(這是一個配置文件),腳本如下:
[sam@chenwy sam]$ grep 'conftroll\.conf' myfile
11、查詢格式化文件名
使用正則表達式可匹配任意文件名。系統中對文本文件有其標准的命名格式。一般最多六個小寫字符,後跟句點,接著是兩個大寫字符。
[sam@chenwy sam]$ grep '^[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename
2、使用通配符*的匹配模式
grep "l.*s" testfile
如在行尾查詢某一單詞,試如下模式:
grep "ng$" testfile
這將在所有文件中查詢行尾包含單詞ng的所有行。