GREP是Global search Regular Expression and Print out the line的簡稱,即全面搜索正則表達式正則表達式
並把行打印出來。GREP是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打bash
印出來,grep也是Linux 中最普遍使用的命令之一。本節重點介紹grep命令,以及grep命令與正則表ide
達式結合使用.工具
grep命令是支持正則表達式的一個多用途文本搜索工具,grep的通常格式爲:編碼
grep [選項][模式][文件…]
grep命令由選項、模式和文件三部分組成,它在一個或多個文件中搜索知足模式的文本行,模式後的spa
全部字符串被看作文件名,文件名能夠有多個,搜索的結果被打印到屏幕,不影響原文件的內容。greorm
p命令的選項用於對搜索過程進行補充說明,grep命令的選項及其意義以下表所示。遞歸
grep命令選項及其意義ci
grep命令的模式十分靈活,能夠是字符串,也能夠是變量,還能夠是正則表達式。須要說明的是,字符串
不管模式是何種形式,只要模式中包含空格,就須要使用雙引號將模式引發來,若是不加雙引號,空
格後的單詞容易被誤認爲是文件名,如普通字符串爲"hello world",grephello world命令就將world
認爲是文件名,所以,grep"hello world"filename纔是正確的寫法。大部分狀況下,使用單引號將模
式引發來也是能夠的;一旦模式中包含空格,就須要使用雙引號或單引號將模式引發來。下面的例子
能夠充分驗證這個觀點。
模式包含空格時,是否使用雙引號的區別
#文件test內容 [shizhenning@zabbix ~]$ cat test job joob jooob joooob hello world! hello jimmy! #查詢包含字符串"hello"的行,不須要""引用模式 [shizhenning@zabbix ~]$ grep hello test hello world! hello jimmy! #查詢包含字符串"hello world"的行,不使用""引用模式時:提示找不到文件或#者目錄world [shizhenning@zabbix ~]$ grep hello world test grep: world: 沒有那個文件或目錄 test:hello world! test:hello jimmy! #查詢包含字符串"hello world"的行,使用""引用模式時:返回正確結果 [shizhenning@zabbix ~]$ grep "hello world" test hello world!
首先搜索test文件中包含 hello 字符串的行,因爲模式 hello 中不包含空格,所以,是否用引號引
起模式對grep 命令不產生影響。當咱們要搜索test 文件中包含hello world 字符串的行時,不用雙
引號將hello world 括起來時,Shell 提示沒有 world 這個文件或目錄,而後,給出test 文件中包
含 hello world 字符串的行,這說明Shell將grep hello world test這條命令解釋爲在world和test
兩個文件中搜索包含hello字符串的行,這顯然與咱們的初衷不符。而當咱們用雙引號將hello world
括起來後,就獲得了正確的結果。
grep支持多文件查詢,請看下面的例子。
演示grep 的多文件查詢
#grep 多文件查詢 [shizhenning@zabbix ~]$ grep jooob test test1 test:jooob test1:jooob #grep 多文件查詢,不顯示文件名 [shizhenning@zabbix ~]$ grep -h jooob test test1 jooob jooob
上例從 test和test1 兩個文件中搜索包含 jooob 字符串的行,命令逐個給出待搜索的文件,結果打印出全部包含jooob字符串的行,默認以文件名開頭,可使用-h選項隱藏文件名
grep 經常使用選項介紹:
grep命令指定多個文件時可使用通配,這樣就沒必要逐個給出待搜索的文件了,例如
用通配表示多文件
[shizhenning@zabbix ~]$ grep -e "\<joob\>" test test1 test:joob test1:joob #能夠修改成以下命令 [shizhenning@zabbix ~]$ grep -e "\<joob\>" test* test:joob test1:joob
上例利用test*代替了test 和test1 兩個文件,顯得十分簡潔。
下面咱們結合具體例子逐個說明grep選項的含義和用法。
1.-c 選項
-c選項表示輸出匹配字符串行的數量,默認狀況下,grep命令打印出包含模式的全部行,一旦加上-c選項,就只顯示包含模式行的數量,下面給出一個使用-c選項的例子。
grep -c 的用法:
[shizhenning@zabbix ~]$ grep "j*b" test job joob jooob joooob #grep -c 用法,僅顯示匹配模式的行數 [shizhenning@zabbix ~]$ grep -c "j*b" test 4
2.-n選項
-n選項列出全部的匹配行,並顯示行號。默認狀況下,grep搜索單個文件時,只顯示每行的內容,搜索多個文件時,顯示文件名及每行的內容,加上-n選項後,將在行內容前附加顯示行號,下面給出一個使用-n選項的例子。
grep -n 的用法
[shizhenning@zabbix ~]$ grep "j*b" test* test:job test:joob test:jooob test:joooob test1:job test1:joob test1:jooob test1:joooob test1:jooooob #grep -n 選項使用,顯示行號 [shizhenning@zabbix ~]$ grep -n "j*b" test* test:1:job test:2:joob test:3:jooob test:4:joooob test1:2:job test1:3:joob test1:4:jooob test1:5:joooob test1:6:jooooob
3.-v 選項
-v選項顯示不包含模式的全部行,下面給出一個使用-v選項的例子。
grep -v 的用法:
[shizhenning@zabbix ~]$ grep -v "j*b" test* test:hello world! test:hello jimmy! test: test1:ignore test1: [shizhenning@zabbix ~]$ grep -vc "j*b" test* test:3 test1:2
結合使用-v 和-c 參數列出test、test1文件中不包含模式中的關鍵字的行數。
4.-i 選項
默認狀況下,grep命令對大小寫是敏感的,若是加上-i選項就表示grep命令不區分大小寫,下面給出一個使用-i選項的例子。
grep -i 的用法
#不使用-i,區分大小寫 [shizhenning@zabbix ~]$ grep "j*b" test* test:job test:joob test:jooob test:joooob test1:job test1:joob test1:jooob test1:joooob test1:jooooob #使用-i,不區分大小寫 [shizhenning@zabbix ~]$ grep -i "j*b" test* test:job test:joob test:jooob test:joooob test1:job test1:joob test1:jooob test1:joooob test1:jooooob test1:JoooooB
5.-h選項
-h選項表示查詢多文件時不顯示文件名,默認狀況下,grep命令查詢多個文件時,在匹配行以前顯示文件名,加上-h選項後,grep命令將再也不顯示文件名。下面給出一個使用-h選項的例子。
[shizhenning@zabbix ~]$ grep "j*b" test* test:job test:joob test:jooob test:joooob test1:job test1:joob test1:jooob test1:joooob test1:jooooob #使用-h選項,只顯示行內容,不顯示文件名 [shizhenning@zabbix ~]$ grep -h "j*b" test* job joob jooob joooob job joob jooob joooob jooooob
6.-l 選項
-l 選項表示只列出符合匹配的文件名,而不列出具體匹配行,下面給出一個使用-l 選項的例子。
grep -l 的用法
[shizhenning@zabbix ~]$ grep "Hello World" test test1 test:Hello World! #使用-l選項,只顯示包含匹配模式的文件名 [shizhenning@zabbix ~]$ grep -l "Hello World" test test1 test
7.-s 選項
-s 選項表示不顯示不存在或無匹配文本的錯誤信息,默認狀況下,grep 在待搜索文件不存在或搜索不到符合模式的文本行時將打印錯誤信息。下面給出一個使用-s選項先後比較的例子
grep -s 的用法
[shizhenning@zabbix ~]$ grep "Hello World" test test1 test2 test:Hello World! grep: test2: 沒有那個文件或目錄 #使用-s選項,不顯示錯誤信息 [shizhenning@zabbix ~]$ grep -s "Hello World" test test1 test2 test:Hello World!
給出一樣的命令使用-s 選項先後的結果,兩條命令都在搜索Hello World字符串,當未使用-s 選項時,提示test2文件不存在的錯誤信息,可是,在grep後加上-s選項後,就再也不打印錯誤信息了。
8.-r 選項
默認狀況下,grep命令只對當前目錄下的文件進行搜索,而不對子目錄中的文件進行搜索。-r 選項表示遞歸搜索,不只搜索當前目錄,並且搜索子目錄。下面舉一個-r選項的例子。
grep -r 的用法
[shizhenning@zabbix ~]$ grep "hello" * test:hello world! test:hello jimmy! #使用-r選項進行遞歸查詢 [shizhenning@zabbix ~]$ grep -r "hello" * aaa/aaa1:hello world! test:hello world! test:hello jimmy!
對當前目錄遞歸搜索hello 字符串,不只列出當前目錄下文件的搜索結果,還列出了子目錄aaa 下文件包含hello字符串的文本行。
9.-w 和-x 選項
grep命令的模式是支持正則表達式的,正則表達式的元字符將被解釋成特殊的含義,-w選項表示匹配
整詞,即以模式的字面含義去解析它。所以,grep命令使用-w選項後,元字符再也不被解釋爲特殊含
義,下面的例子說明了-w項
grep -w 的用法
#grep -w 的用法 [shizhenning@zabbix ~]$ grep hel* test* test:hello world! test:hello jimmy! #加上-w選項後,表示搜索包含hel*字符串的文本行 [shizhenning@zabbix ~]$ grep -w hel* test* [shizhenning@zabbix ~]$#沒有知足該條件的文本行
上例兩條命令的模式都爲hel*,當未用-w 選項時,模式中的*被解析爲任意字符,即搜索包含以
cer 開頭字符串的文本行;加上-w選項後,*被解析爲字面含義,表示搜索包含cer*字符串的文本行,
當前目錄中的文件中不包含cer*這一完整的字符串。所以,無任何結果輸出。
-x 選項是匹配整行,即只有當文件中有整行內容與模式匹配時,grep命令才輸出該行結果,下面的例
子說明grep命令的-w和-x 選項的區別。
說明grep 命令的-w和-x 選項的區別
[shizhenning@zabbix ~]$ cat test #查看文件test內容 job joob jooob joooob jimmy hello hello world! hello jimmy! Hello World! #搜索包含單詞jimmy的問本行 [shizhenning@zabbix ~]$ grep -w 'jimmy' test jimmy hello jimmy! #搜索正行文本是單詞jimmy的行 [shizhenning@zabbix ~]$ grep -x 'jimmy' test jimmy
能夠看出,-w 選項搜索的是整詞匹配,而-x 選項搜索的是整行匹配。
10.-q 選項
從上面的講解中知道,grep命令默認狀況下是輸出結果的,可是,grep命令後一旦加上-q 選項,grep
將再也不輸出任何結果,而是以退出狀態表示搜索是否成功,退出狀態0 表示搜索成功,退出狀態1 表
示未搜索到知足模式的文本行,退出狀態2表示命令或程序因爲錯誤而未能執行。
下面咱們舉一個例子說明grep -q 選項的含義。
演示grep -q 選項
#grep命令搜索成功 [shizhenning@zabbix ~]$ grep -qx 'jimmy' test [shizhenning@zabbix ~]$ echo $? 0 #退出狀態爲0 #grep命令未搜索到匹配模式的文本行 [shizhenning@zabbix ~]$ grep -qx 'jimmy' test1 [shizhenning@zabbix ~]$ echo $? 1 #退出狀態爲1 #grep命令執行失敗 [shizhenning@zabbix ~]$ grep -qx 'jimmy' test2 grep: test2: 沒有那個文件或目錄 [shizhenning@zabbix ~]$ echo $? 2 #退出狀態爲2
grep命令的-E 和-F選項分別等價於grep命令族中的egrep和fgrep命令。有關grep 命令選項、模式和文件的介紹到此爲止。
grep和正則表達式結合使用
將帶元字符的正則表達式用於grep命令可以更靈活地匹配信息,使用時須要使用單引號將正則表達式
引發來,以避免發生一些不可預知的錯誤。下面經過一些例子來介紹grep與正則表達式結合的用法,以
增強讀者對grep命令的認識,並且有利於對正則表達式的鞏固。
1.匹配行首
元字符"^"表示行首,若須要匹配.pem爲後綴文件中以橫槓(-)開頭的行,可輸入以下所示的命令:
grep 查找以h符號開頭的行
[shizhenning@zabbix ~]$ cat test job joob jooob joooob jimmy hello hello world! hello jimmy! Hello World! #查找以h字符開頭的問本行 [shizhenning@zabbix ~]$ grep '^h' test hello hello world! hello jimmy! [shizhenning@zabbix ~]$
下面的例子結合grep和正則表達式搜索空白行,第1 個命令的意義爲匹配test文件中空白行的行數,顯示結果說明test文件中有1行空白行。第2 個命令爲匹配test文件中非空白行的行數,此時使用[^$]符號表示空白行範圍,前面加上"^"符號取反,顯然,^^$表達式是錯誤的,由於grep 將第1 個"^"理解爲行首,顯示結果說明test文件中有27 行空白行。
查找空白行
#查找空白行,只打印行數 [shizhenning@zabbix ~]$ grep -c '^$' test 1 #查找飛空白行,只打印行數 [shizhenning@zabbix ~]$ grep -c '^[^$]' test 9
2.設置大小寫
利用-i 符號可使grep 命令不區分大小寫,固然也可利用[]符號來實現這一功能。下面給出用[]符號設置大小寫的例子。
用[]符號設置大小寫
[shizhenning@zabbix ~]$ grep -n '[Hh]ello' test 6:hello 7:hello world! 8:hello jimmy! 9:Hello World!
上例匹配test文件中Hello和hello兩個關鍵字的行,並使用-n顯示匹配的行號。
3.匹配重複字符
匹配重複字符一般能夠利用"."符號和"*"符號來實現。首先舉一個"."符號的例子。
grep 和.符號
[shizhenning@zabbix ~]$ cat test job joob jooob joooob jimmy hello hello world! hello jimmy! Hello World! /usr/local/zabbix/ /home/shizhenning/ [shizhenning@zabbix ~]$ grep '^/.../' test /usr/local/zabbix/
上例搜索test文件中以/字符開始、中間3個任意字符、第5個字符仍爲/的行,顯示結果/usr/知足匹配條件。
而後給出一個"*"符號的例子。
grep 和*符號
[shizhenning@zabbix ~]$ grep '^/.*/' test /usr/local/zabbix/ /home/shizhenning/
上例搜索以"/"開頭,後面跟一個任意字符,能夠重複0次或者屢次,後面還是"/"字符的行。
4.轉義符
若是匹配的目標字符串中包含元字符,則須要利用轉義符"\"屏蔽其意義。若是須要搜索包含
aa.bb.cc字符串的行,因爲句號"."字符是元字符,因此,須要在"."符號以前加上"\"符號進行轉
義。若是將命令寫成
grep 'aa.bb.cc' test
則是匹配aa 和bb、cc 之間存在任意單個字符的行,如aaxbbxcc 可以知足條件。下面給出
搜索包含aa.bb.cc字符串的行的例子。
grep 和轉義符
[shizhenning@zabbix ~]$ cat test job joob jooob joooob jimmy hello hello world! hello jimmy! Hello World! /usr/local/zabbix/ /home/shizhenning/ aa.bb.cc [shizhenning@zabbix ~]$ grep -n 'aa\.bb\.cc' test 12:aa.bb.cc [shizhenning@zabbix ~]$
由上例的結果能夠看出,轉義符使得元字符"."符號被解析爲字面含義,打印出了包含aa.bb.cc字符串
的行。
橫槓(-)字符較爲特別,它雖然不屬於正則表達式元字符,可是,因爲"-"字符是引出grep 命令選項
的特殊字符,因此,當模式以"-"符號開頭時,須要用轉義符將其轉義,請看下面的例子。
-字符在grep命令中的特殊性
[shizhenning@zabbix ~]$ cat test job joob jooob joooob jimmy hello hello world! hello jimmy! Hello World! /usr/local/zabbix/ /home/shizhenning/ aa.bb.cc ---comment--- [shizhenning@zabbix ~]$ grep '-\{3\}' test #模式以-符號開頭 grep:無效選項 -- \ #提示錯誤,grep將模式解析爲選項 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more information. [shizhenning@zabbix ~]$ grep '\-\{3\}' test #使用轉義符對-符號進行轉義,返回正確結果 ---comment--- [shizhenning@zabbix ~]$
上面的命令在"-"符號前加上轉義符,並用引號將模式引發來,獲得了正確的結果。注意,這裏模式上
的引號十分重要,若是不加引號,仍然提示無效選項錯誤。
#模式不加引號仍然提示錯誤 [shizhenning@zabbix ~]$ grep \-\{3\} test grep:無效選項 -- { Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more information. [shizhenning@zabbix ~]$
5.POSIX字符類
爲了保持不一樣國家的字符編碼的一致性,POSIX(Portable Operating System Interface)增長了特
殊的字符類,以[:classname:]的格式給出,grep 命令支持POSIX 字符類,首先將POSIX類及其意義列
出。
POSIX字符類
下面舉幾個例子來講明POSIX 字符類的用法,首先,給出一個利用POSIX 字符類搜索以大寫字母開頭的行:
利用POSIX 字符類搜索以大寫字母開頭的行
[shizhenning@zabbix ~]$ grep '^[[:upper:]]' test Hello World!
上例的命令使用POSIX 字符類做爲模式,[:upper:]表示大寫字母集合,再用一層方括號將[:upper:]
括起,表示匹配字符集合,獲得的結果確實是全部以大寫字母開頭的文本行。再舉一個搜索以空格開
頭文本行的例子:
搜索以空格開頭文本行
[shizhenning@zabbix ~]$ cat test job joob jooob joooob jimmy hello hello world! hello jimmy! Hello World! /usr/local/zabbix/ /home/shizhenning/ aa.bb.cc ---comment--- Hello World! [shizhenning@zabbix ~]$ grep '^[[:space:]]' test Hello World! [shizhenning@zabbix ~]$
上例的命令仍以POSIX 字符類做爲模式,[:space:]用法與[:upper:]相似。事實上,POSIX字符類做爲
模式的用法都相似,使用時只要注意用方括號將POSIX 字符類括起來便可。
6.精確匹配
"\<\>"符號用於精確匹配,在此結合grep命令對此符號進行介紹。
首先給出一個說明性的例子,咱們結合例子闡釋何爲精確匹配,以及"\<\>"符號的用法,例子以下所示:
精確匹配
[shizhenning@zabbix ~]$ cat test job joob jooob joooob jimmy hello hello world! hello jimmy! Hello World! /usr/local/zabbix/ /home/shizhenning/ aa.bb.cc ---comment--- Hello World! hell #搜索包含hell字符串的文本行 [shizhenning@zabbix ~]$ grep 'hell' test hello #hello中包含hell字符串 hello world! hello jimmy! hell #精確匹配hell這個單詞 [shizhenning@zabbix ~]$ grep '\<hell\>' test hell [shizhenning@zabbix ~]$
事實上,grep命令的-w選項也可用於精確匹配,下面的命令等價於上例的 grep '\<hell\>' test 命令:
#使用-w選項來實現精確匹配 [shizhenning@zabbix ~]$ grep -w "hell" test hell
7.或字符
或字符"|"是擴展的正則表達式中定義的,grep須要加上-E選項才能支持它,下面給出grep命令使
用"|"字符的例子。
grep 命令與|字符
#使用-E選項grep執行成功 [shizhenning@zabbix ~]$ grep -E 'world|jimmy' test jimmy hello world! hello jimmy! #不適用-E選項沒有找到匹配項 [shizhenning@zabbix ~]$ grep 'world|jimmy' test [shizhenning@zabbix ~]$ echo $? 1 #返回1,表示沒有找到匹配模式的文本行 [shizhenning@zabbix ~]$
上訴兩個命令用於匹配帶有world或jimmy字符串的行,grep帶上-E 選項後獲得正確的結果。而grep沒
有帶-E 選項時,返回結果爲空,這是由於grep命令將"|"字符解析爲字面意義。注意,world|jimmy上
的引號必不可少。
grep命令與正則表達式結合使用極大地增長了命令應用的靈活性,同時也增大了使用命令的難度,只
有多練習,多思考分析,纔有可能熟練而靈活地運用grep命令。