1. 程式人生 > 其它 >grep (global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來)

grep (global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來)

GREP
grep (global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來)是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹配的行打印出來。Unix的grep家族包括grep、egrep和fgrep。

基本簡介

egrep和fgrep的命令只跟grep有很小不同。egrep和fgrep都是grep的擴充套件,支援更多的re元字元,fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表示式中的元字元表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令列選項來使用egrep和fgrep的功能。
grep的工作方式是這樣的,它在一個或多個檔案中搜索字串模板。如果模板包括空格,則必須被引用,模板後的所有字串被看作檔名。搜尋的結果被送到螢幕,不影響原檔案內容。
grep可用於shell指令碼,因為grep通過返回一個狀態值來說明搜尋的狀態,如果模板搜尋成功,則返回0,如果搜尋不成功,則返回1,如果搜尋的檔案不存在,則返回2。我們利用這些返回值就可進行一些自動化的文字處理工作。
表達符集

^
錨定行的開始 如:'^grep'匹配所有以grep開頭的行。
$
錨定行的結束 如:'grep$'匹配所有以grep結尾的行。
.
匹配一個非換行符('\n')的字元如:'gr.p'匹配gr後接一個任意字元,然後是p。
*
匹配零個或多個先前字元 如:' *grep' (注意*前有空格)匹配所有零個或多個空格後緊跟grep的行,需要用egrep 或者grep帶上 -E 選項。 .*一起用代表任意字元。
[]
匹配一個指定範圍內的字元,如'[Gg]rep'匹配Grep和grep。
[^]
匹配一個不在指定範圍內的字元,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一個字母開頭,緊跟rep的行。
\(..\)
標記匹配字元,如'\(love\)',love被標記為1。
\<
錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行。
\>
錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。
x\{m\}
重複字元x,m次,如:'o\{5\}'匹配包含5個o的行。
x\{m,\}
重複字元x,至少m次,如:'o\{5,\}'匹配至少有5個o的行。
x\{m,n\}
重複字元x,至少m次,不多於n次,如:'o\{5,10\}'匹配5--10個o的行。
\w
匹配文字和數字字元,也就是[A-Za-z0-9],如:'G\w*p'匹配以G後跟零個或多個文字或數字字元,然後是p。
\W
\w的反置形式,匹配一個或多個非單詞字元,如點號句號等。
\b
單詞鎖定符,如: '\bgrep\b'只匹配grep。
用於egrep和 grep -E的元字元擴充套件集
\+
匹配一個或多個先前的字元。如:'[a-z]\+able',匹配一個或多個小寫字母后跟able的串,如loveable,enable,disable等。
\?
匹配零個或一個先前的字元。如:'gr\?p'匹配gr後跟一個或沒有字元,然後是p的行。
a\|b\|c
匹配a或b或c。如:grep|sed匹配grep或sed
\(\)
分組符號,如:love\(ab\le\|rs\)ov\+匹配loveable或lovers,匹配一個或多個ov。
POSIX字元類
為了在不同國家的字元編碼中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字元類,如[:alnum:]是A-Za-z0-9的另一個寫法。要把它們放到[]號內才能成為正則表示式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支援POSIX的字元類。
[:alnum:]
文字數字字元
[:alpha:]
文字字元
[:digit:]
數字字元
[:graph:]
非空字元(非空格、控制字元)
[:lower:]
小寫字元
[:cntrl:]
控制字元
[:print:]
非空字元(包括空格)
[:punct:]
標點符號
[:space:]
所有空白字元(新行,空格,製表符)
[:upper:]
大寫字元
[:xdigit:]
十六進位制數字(0-9,a-f,A-F)
命令選項

-?
同時顯示匹配行上下的?行,如:grep -2 pattern filename同時顯示匹配行的上下2行。
-a, --text
等價於匹配text,用於(Binary file (standard input) matches)報錯
-b,--byte-offset
列印匹配行前面列印該行所在的塊號碼。
-c,--count
只打印匹配的行數,不顯示匹配的內容。
-f File,--file=File
從檔案中提取模板。空檔案中包含0個模板,所以什麼都不匹配。
-h,--no-filename
當搜尋多個檔案時,不顯示匹配檔名字首。
-i,--ignore-case
忽略大小寫差別。
-o, --only-matching
只顯示正則表示式匹配的部分。(show only the part of a line matching PATTERN)
-q,--quiet
取消顯示,只返回退出狀態。0則表示找到了匹配的行。
-l,--files-with-matches
列印匹配模板的檔案清單。
-L,--files-without-match
列印不匹配模板的檔案清單。
-n,--line-number
在匹配的行前面列印行號。
-s,--silent
不顯示關於不存在或者無法讀取檔案的錯誤資訊。
-v,--revert-match
反檢索,只顯示不匹配的行。
-w,--word-regexp
如果被\<和\>引用,就把表示式做為一個單詞搜尋。
-R, -r, --recursive
遞迴的讀取目錄下的所有檔案,包括子目錄。 比如 grep -R 'pattern' test會在 test 及其子目錄下的所有檔案中,匹配 pattern。
-V,--version
顯示軟體版本資訊。
例項

要用好grep這個工具,其實就是要寫好正則表示式,所以這裡不對grep的所有功能進行例項講解,只列幾個例子,講解一個正則表示式的寫法。
$ ls -l | grep '^a'
通過管道過濾ls -l輸出的內容,只顯示以a開頭的行。
$ grep 'test' d*
顯示所有以d開頭的檔案中包含test的行。
$ grep 'test' aa bb cc
顯示在aa,bb,cc檔案中匹配test的行。
$ grep '[a-z]\{5\}' aa
顯示所有包含每個字串有5個連續小寫字元的字串的行。
$ grep 'w\(es\)t.*\1' aa
如果west被匹配,則es就被儲存到記憶體中,並標記為1,然後搜尋任意個字元(.*),這些字元後面緊跟著另外一個es(\1),找到就顯示該行。如果用egrep或grep -E,就不用"\"號進行轉義,直接寫成'w(es)t.*\1'就可以了。
注意

在某些機器上,要使用-E引數才能夠進行邏輯匹配(詳見下)
grep "a|b" (匹配包含字元樣式為"a|b"的行)
grep -E "a|b" (匹配包含字元樣式為"a"或"b"的行)
man grep裡面關於-E引數的說明是
-E
Treats each pattern specified as an extended regular expression (ERE). A NULL value for the ERE matches every line.
Note: The grep command with the -E flag is the same as the egrep command, except that error and usage messages are different and the -s flag functions differently.
拓展命令

egrep 命令,搜尋檔案獲得模式。
egrep 命令會在輸入檔案(預設值為標準輸入)中搜索與用 Pattern 引數指定的模式相匹配的行。這些模式是完整的正則表示式就像在 ed 命令中的那樣(除了 \ (反斜槓)和 \\ (雙反斜槓))。下列規則也應用於 egrep 命令:
* 一個正則表示式後面帶一個 + (加號)會匹配一個或多個的正則表示式。
* 一個正則表示式後面帶一個 ? (問號)會匹配零個或一個該正則表示式。
* 由 | (豎線)或者換行符隔開的多個正則表示式會匹配與任何一個正則表示式所匹配的字串。
* 一個正則表示式可以被包括在“()”(括弧)中進行分組。
換行符將不會被正則表示式匹配。
運算子的優先順序是 [, ], *, ?, +, 合併, | 和換行符。
注意: egrep 命令與 grep 命令帶 -E 標誌是一樣的,除了錯誤訊息和使用訊息不同以及 -s 標誌的功能不同之外。
egrep 命令會顯示包含該匹配行的檔案,如果您指定了多於一個 File 引數的話。
對 shell 有特殊含義的字元($, *, [, |, ^, (, ), \ ) 出現在 Pattern 引數中時必須帶雙引號。如果 Pattern 引數不是簡單字串,通常必須用單引號將整個模式括起來。在表示式中比如 [a-z],減號表示通過當前整理序列。整理序列可以定義等價的類以供在字元範圍中使用。它使用了快速確定性的演算法,有時需要外部空間。
fgrep命令, 為檔案搜尋文字字串。
fgrep命令搜尋 File 引數指定的輸入檔案(預設為標準輸入)中的匹配模式的行。fgrep命令特別搜尋 Pattern 引數,它們是固定的字串。如果在 File 引數中指定一個以上的檔案fgrep命令將顯示包含匹配行的檔案。
fgrep命令於 grep 和 egrep 命令不同,因為它搜尋字串而不是搜尋匹配表示式的模式。fgrep命令使用快速的壓縮演算法。$, *, [, |, (, ) 和 \ 等字串被fgrep命令按字面意思解釋。這些字元並不解釋為正則表示式,但它們在 grep 和 egrep 命令中解釋為正則表示式。
因為這些字元對於 shell 有特定的含義,完整的字串應該加上單引號(‘ ... ’)。
如果沒有指定檔案,fgrep命令假定標準輸入。一般,找到的每行都複製到標準輸出中去。如果不止一個輸入檔案,則在找到的每行前列印檔名。