http://man.chinaunix.net/newsoft/grep/open.htm
1 grep簡介
grep (global search regular expression(RE) and print out the line,全面搜尋Regex並把行列印出來)是一種強大的文本搜尋工具,它能使用Regex搜尋文本,並把匹配的行列印出來。Unix的grep家族包 括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴充,支援更多的re元字元,fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,Regex中的元字元表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能 更強,可以通過-G、-E、-F命令列選項來使用egrep和fgrep的功能。
grep的工作方式是這樣的,它在一個或多個檔案中搜尋字串模板。如果模板包括空格,則必須被引用,模板後的所有字串被看作檔案名稱。搜尋的結果被送到螢幕,不影響原檔案內容。
grep可用於shell指令碼,因為grep通過返回一個狀態值來說明搜尋的狀態,如果模板搜尋成功,則返回0,如果搜尋不成功,則返回1,如果搜尋的檔案不存在,則返回2。我們利用這些傳回值就可進行一些自動化的文本處理工作。
【特別注意】
1,grep用正則匹配進行文本搜尋
2,grep搜尋建議:
字串建議使用雙引號:grep "ZOO_INFO" zookeeper.log
正則匹配應使用單引號:grep "\<ZOO_INFO\>" zookeeper.log
用法:grep [options] PATTERN [FILE...]
2 grepRegex元字元集(基本集)
^ 錨定行的開始 如:'^grep'匹配所有以grep開頭的行。$ 錨定行的結束 如:'grep$'匹配所有以grep結尾的行。. 匹配一個非分行符號的字元 如:'gr.p'匹配例如grep。* 匹配零個或多個先前字元 如:'*grep'匹配所有一個或多個空格後緊跟grep的行。 .*一起用代表任一字元。[] 匹配一個指定範圍內的字元,如'[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。
3. 用於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(able|rs)ov+匹配loveable或lovers,匹配一個或多個ov。x{m},x{m,},x{m,n} 作用同x\{m\},x\{m,\},x\{m,n\}
4. POSIX字元類 為 了在不同國家的字元編碼中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字元類,如[:alnum:]是A-Za-z0-9的另一個寫法。 要把它們放到[]號內才能成為Regex,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支援POSIX的字元類。
[:alnum:] 文字數字字元[:alpha:] 文字字元[:digit:] 數字字元[:graph:] 非Null 字元(非空格、控制字元)[:lower:] 小寫字元[:cntrl:] 控制字元[:print:] 非Null 字元(包括空格)[:punct:] 標點符號[:space:] 所有空白字元(新行,空格,定位字元)[:upper:] 大寫字元[:xdigit:] 十六進位數字(0-9,a-f,A-F)
5. Grep命令選項
-?同時顯示匹配行上下的。行,如:grep -2 pattern filename同時顯示匹配行的上下2行。-b,--byte-offset列印匹配行前面列印該行所在的塊號碼。-c,--count只列印匹配的行數,不顯示匹配的內容。-f File,--file=File從檔案中提模數板。空檔案中包含0個模板,所以什麼都不匹配。-h,--no-filename當搜尋多個檔案時,不顯示匹配檔案名稱首碼。-i,--ignore-case忽略大小寫差別。-q,--quiet取消顯示,只返回退出狀態。0則表示找到了匹配的行。-l,--files-with-matches列印匹配模板的檔案清單。-L,--files-without-match列印不匹配模板的檔案清單。-n,--line-number在匹配的行前面列印行號。-s,--silent不顯示關於不存在或者無法讀取檔案的錯誤資訊。-v,--revert-match反檢索,只顯示不匹配的行。-w,--word-regexp類似正則中被\<和\>引用,就把運算式做為一個單詞搜尋。只匹配整個單詞,而不是字串的一部分(如匹配‘magic’,而不是‘magical’)。-V,--version顯示軟體版本資訊。-r,-R, --recursive遞迴尋找
6. 執行個體
要用好grep這個工具,其實就是要寫好Regex,所以這裡不對grep的所有功能進行執行個體講解,只列幾個例子,講解一個Regex的寫法。 $ ls -l | grep '^d'
通過管道過濾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'就可以了。
7. 練習grep命令
demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.this line is the 1st lower case line in this file.This Line Has All Its First Character Of The Word With Upper Case.Two lines above this line is empty.And this is the last line.
7.1.從單個檔案中搜尋指定的字串 grep的基礎用法是如下例的從指定的檔案中搜尋特定的字串。
文法:
grep "literal_string" filename
$ grep "this" demo_filethis line is the 1st lower case line in this file.Two lines above this line is empty.And this is the last line.
7.2. 在多個檔案中檢索指定的字串 文法:
grep "string" FILE_PATTERN
先拷貝demo_file為demo_file1。grep的結果在合格行前將包括檔案名稱。當檔案名稱包含元字元時,linux shell會將匹配的所有檔案作為輸入到grep中去。
$ cp demo_file demo_file1$ grep "this" demo_*demo_file:this line is the 1st lower case line in this file.demo_file:Two lines above this line is empty.demo_file:And this is the last line.demo_file1:this line is the 1st lower case line in this file.demo_file1:Two lines above this line is empty.demo_file1:And this is the last line.
7.3 用 grep -o 只輸出特定匹配:
grep -o "lsyun_elapsed:[0-9]*" ./lsyun_time.log | awk -F: '{print $2}' | sort | uniq -c
7.4. 用 grep -i 進行大小寫無關的搜尋 文法:
grep -i "string" FILE
也是一個基本用法,對搜尋的字串忽略大小寫,因此下例中匹配“the”, “THE” and “The”。
$ grep -i "the" demo_fileTHIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.this line is the 1st lower case line in this file.This Line Has All Its First Character Of The Word With Upper Case.And this is the last line.
7.4. 使用用Regex 文法:
grep "REGEX" filename
如果你能有效地利用Regex,這是個很有用的特點。在下面的例子中,搜尋全部以“lines”開始以“empty”結束的字串,如搜尋“lines[之間任意字]empty” ,並且忽略大小寫。
$ grep -i "lines.*empty" demo_fileTwo lines above this line is empty.
7.5. 用grep -w搜尋整個詞,而不是詞中的部分字串 使用-w選項搜尋一個單詞,並且避免搜尋到詞中的部分字串。
下例搜尋"is"。如果不加-w選項,將顯示“is”, “his”, “this” 等所有包含“is”的行。
$ grep -i "is" demo_fileTHIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.this line is the 1st lower case line in this file.This Line Has All Its First Character Of The Word With Upper Case.Two lines above this line is empty.And this is the last line.
下例使用了-w選項,請注意結果中不包含 “This Line Has All Its First Character Of The Word With Upper Case”, 雖然 “This”中包含“is”。
$ grep -iw "is" demo_fileTHIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.this line is the 1st lower case line in this file.Two lines above this line is empty.And this is the last line.
7.6. 使用grep -A, -B and -C顯示之前、之後、前後的幾行 當使用grep搜尋大檔案時,顯示匹配行附近的多行資料是一個很有用的功能。
7.6.1 顯示匹配行之後的N行
-A
文法:
grep -A "string" FILENAME
下例顯示匹配行和之後的3行資料
$ grep -A 3 -i "example" demo_text
7.6.2顯示匹配行之前的N行
-B
文法:
grep -B "string" FILENAME
下例顯示匹配行和之前的2行資料
$ grep -B 2 "single WORD" demo_text
7.6.3顯示匹配行前後的N行
-C 顯示之前的n行,之後的n行資料.
$ grep -C 2 "Example" demo_text
7.7.通過GREP_OPTIONS高亮顯示搜尋的字串 如果你希望搜尋的字串高亮顯示在結果中,可以試用以下的辦法。通過修改GREP_OPTIONS對搜尋字串高亮顯示。
$ export GREP_OPTIONS='--color=auto' GREP_COLOR='100;8'
7.8. 用grep -r遞迴搜尋全部的檔案 如果想尋找當前目前以及其子目錄的全部檔案時,可以使用 -r 選項。如下例
$ grep -r "ramesh" *
注意這裡用*是可以的,但是不能對檔案進行正則匹配:
$ grep -r "ramesh" *.c 錯誤。。。
正確的辦法可以這樣:
$ find . -name *.c | xargs grep -r "ramesh"或者$ grep -r "ramesh" * --include="*.c"
7.9. 使用grep -v進行不匹配 可以使用-v選項顯示不匹配搜尋字串的行。
下例顯示demo_text檔案中不包含“go”的行
$ grep -v "go" demo_text
7.10. 顯示不匹配全部模式的行 文法:
grep -v -e "pattern" -e "pattern"
建立如下例子檔案test-file.txt
abcd
$ grep -v -e "a" -e "b" -e "c" test-file.txtd
7.11.用grep -c 統計匹配的行數 文法:
grep -c "pattern" filename
$ grep -c "go" demo_text6
統計不匹配的行數
$ grep -v -c this demo_file4
7.12. 用grep -l 只顯示檔案名稱
$ grep -l this demo_*demo_filedemo_file1
7.13. 只顯示匹配的字串 預設顯示匹配字串的所在行,可以使用-o選項只顯示匹配的字串。這項功能當使用Regex時比較有用處。
$ grep -o "is.*line" demo_fileis line is the 1st lower case lineis lineis is the last line
7.14. 顯示匹配的位置 文法:
grep -o -b "pattern" file
$ cat temp-file.txt1234512345
$ grep -o -b "3" temp-file.txt0:36:3
注意: 以上輸出顯示的不是行內的位置,而是整個檔案中的位元組byte位置
7.15. 用 grep -n 在輸出時顯示行號 行號從1開始
$ grep -n "go" demo_text