grep工具的使用


工具介紹

grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。Unix的grep家族包括grep、 egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字符, fgrep就是 fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux 使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。

grep的工作方式是這樣的,它在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板後的所有字符串被看作文件名。搜索的結果被送到屏幕,不影響原文件內容。

grep可用於shell腳本,因爲grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。

grep工具使用到了正則表達式,通過正則表達式可以非常方便地對模式進行匹配查找,因此要對正則表達式有一點點了解。

正則表達式

在網上找了一段,引用如下:

  在最簡單的形式中,正則表達式(regular expression)是用來在文件中定位文本的一些搜索標準。例如,要查找所 有包含單詞 “admin” 的行,我們就可以對 “admin” 進行搜索。因此,“admin” 就構成了一個正則表達式。如果我們不但希望查找 “admin”,而且還想將其替換成 “root”,那麼我們就可以在一個工具中使用適當的命令將 “admin” 替換成 “root”。它們都構成了正則表達式。

正則表達式所採用的一些基本規則如下:

  • 任何單個字符或一串字符都可以匹配字符本身,例如上面的 “admin” 的例子。
  • ^ 符號(^)表示一行的開始;$ 符號($)表示一行的結束。
  • 要搜索特殊字符(例如 $ 符號),需要在這些字符前面加上反斜線(\)。例如, \$ 就表示查找 $,而不是一行的末尾。
  • 點(.)代表任何單個字符。例如,ad..n 代表 5 個字符項,前兩個字符是 “ad”,最後一個字符是 “n”。中間兩個字符可以是任何字符,但是隻能是由兩個字符組成。
  • 任何時候如果正則表達式包含在斜線中(例如 /re/),搜索就是通過文件順序進行的。如果正則表達式包含在問號中(例如,?re?),搜索就是通過文件逆序進行的。
  • 方括號([])表示多個值,減號(-)表示值的範圍。例如,[0-9] 與 [0123456789] 相同,[a-z] 就等效於搜索任何小寫字符。如果一個列表的首字符是 ^ 符號,它就匹配不在這個清單中的任何字符。

  表 1 給出了這些規則是如何真正進行匹配的。

表 1. 示例正則表達式 例子 說明 [abc] 匹配 “a”、“b”、“c” 之一 [a-z] 匹配從 “a” 到 “z” 的任何一個小寫字符 [A-Z] 匹配從 “A” 到 “Z” 的任何一個大寫字符 [0-9] 匹配從 0 到 9 的任何一個數字 [^0-9] 匹配任何除了 0 到 9 數字範圍內的任何字符 [-0-9] 匹配從 0 到 9 的任何數字,或者是短橫線(-) [0-9-] 匹配從 0 到 9 的任何數字,或者是短橫線(-) [^-0-9]匹配除從 0 到 9 的數字和短橫線(-)之外的任何字符 [a-zA-Z0-9] 匹配任何字符或數字


grep工具基本命令使用舉例

1、查詢ssh_config與sshd_config文件中包含host模式的行。

命令格式:grep pattern file1 file2 ... fileN
命令說明:查詢文件file1、file2、……fileN中包含pattern模式的行,並打印出來。
命令示例:
可以使用命令grep host ../etc/ssh/ssh_config ../etc/ssh/sshd_config
執行命令,運行結果如圖所示:


2、查詢ssh_config與sshd_config文件中包含protocol模式的行,要求顯示出現protocol模式的行及其後面3行。

命令格式:grep [option] pattern file1 file2 ... fileN
選項選擇:option指定爲-A num,其中num表示顯示出滿足條件的行數。
命令說明:查詢文件file1、file2、……fileN中包含pattern模式的行,並打印出來。
命令示例:
可以使用命令 grep -A 3 protocol ../etc/ssh/ssh_config ../etc/ssh/sshd_config
執行命令,運行結果如圖所示:


包含模式protocol的指定-A選項的段落以“--”分隔開。
上面第一段有6行,是因爲protocol連續在相接近的行中出現過。

3、查詢ssh_config與sshd_config文件中包含以s和r並且他們之間可以含有2個字符的模式的行

命令格式:grep pattern file1 file2 ... fileN
命令說明:查詢文件file1、file2、……fileN中包含pattern模式的行,並打印出來。
命令示例:
可以使用命令grep s..r ../etc/ssh/ssh_config ../etc/ssh/sshd_config
執行命令,運行結果如圖所示:


4、查詢ssh_config與sshd_config文件中包含以r結尾,並且r之前可以含有至少2個字符的模式的行

命令格式:grep pattern file1 file2 ... fileN
命令說明:查詢文件file1、file2、……fileN中包含pattern模式的行,並打印出來。
命令示例:
可以使用命令 grep ..r$ ../etc/ssh/ssh_config ../etc/ssh/sshd_config
執行命令,運行結果如圖所示:


5、查詢ssh_config與sshd_config文件中包含“PasswordAuthentication yes”模式的行

命令格式:grep pattern file1 file2 ... fileN
命令說明:查詢文件file1、file2、……fileN中包含pattern模式的行,並打印出來。
命令示例:
可以使用命令 grep "PasswordAuthentication yes" ../etc/ssh/ssh_config ../etc/ssh/sshd_config
執行命令,運行結果如圖所示:


這裏,因爲模式是含有空格的,所以必須使用""引起來,否則它會把第一串的當作匹配的模式,空格後面的當作是文件。如果上面執行 grep PasswordAuthentication yes ../etc/ssh/ssh_config ../etc/ssh/sshd_config,結果如圖所示:


上面把PasswordAuthentication當成是匹配的模式,而把yes當成是一個文件,但是不影響從文件列表中匹配存在的正確的文件名稱。

5、查詢etc/ssh/目錄下以config結尾的文件中包含host模式的行

命令格式:grep pattern file1 file2 ... fileN
命令說明:查詢文件file1、file2、……fileN中包含pattern模式的行,並打印出來。
命令示例:
可以使用命令 grep host ../etc/ssh/*config
執行命令,運行結果如圖所示:


文件列表中,文件名稱也可是使用正則表達式指定匹配的模式。

6、查詢ssh_config與sshd_config文件中包含protocol模式的行,要求顯示出現protocol模式的行及其後面3行,同時顯示行號。

命令格式:grep [option] pattern file1 file2 ... fileN
命令說明:根據option指定的選項,查詢文件file1、file2、……fileN中包含pattern模式的行,並打印出來。
命令示例:
可以使用命令 grep host ../etc/ssh/*config
執行命令,運行結果如圖所示:


使用了選項-n來顯示對應在文件中的行號。
另外,還有一些常用的選項,如-i表示忽略大小寫等等。

grep工具更多使用參考

可以參考http://q.yesky.com/group/review-15058614.html。如下所示:

1、grep正則表達式元字符集(基本集) 


  ^ 
錨定行的開始 如:'^grep'匹配所有以grep開頭的行。 

錨定行的結束 如:'grep$'匹配所有以grep結尾的行。 
匹配一個非換行符的字符 如:'gr.p'匹配gr後接一個任意字符,然後是p。 

匹配零個或多個先前字符 如:'*grep'匹配所有一個或多個空格後緊跟grep的行。 .*一起用代表任意字符。 
[] 
匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep。 
[^] 
匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行。 
\(..\) 
標記匹配字符,如'\(love\)',love被標記爲1。 
\< 
錨定單詞的開始,如:'\\> 
錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。 
x\{m\} 
重複字符x,m次,如:'0\{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 
單詞鎖定符,如: '\bgrepb\'只匹配grep。

2. 用於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\}

3. 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)

4. 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 
如果被\<和\>引用,就把表達式做爲一個單詞搜索。 
-V,--version 
顯示軟件版本信息。

5. 實例

  要用好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'就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章