一、grep工具快速查找表
grep與標準正則表達式結合常見條目:
形式 | 說明 |
---|---|
. | 這是一個英文的點號。表示匹配任意單個字符; |
[] | 表示匹配指定範圍內的任意單個字符; |
[^] | 表示匹配指定範圍外的任意單個字符; |
* | 表示匹配前面的條目0次或多次; |
.* | 表示匹配任意長度的任意字符; |
\? | 表示匹配前邊的條目至多一次,既 0次或1次; |
\+ | 表示匹配前邊的條目1次或多次; |
\{n\} | 表示匹配前邊的條目n次,多於n次,少於n次都不可行; |
\{n,\} | 表示匹配前邊的條目n次或n次以上,既大於等於n次; |
\{,m\} | 表示匹配前邊的條目至多m次,既小於等於m次;(GNU擴展用法) |
\{n,m\} | 表示匹配前邊的條目至少n次,至多m次,包含n和m且m要大於等於n; |
A\|B | 表示A部分或者B部分; |
\(...\) | 表示分組,其後可用\num對分組的內容做引用,num表示數字; |
^ | 脫字符表示錨定行首,可以理解爲匹配到的是空串(empty string); |
$ | 美元符表示錨定行尾,可以理解爲匹配到的是空串(empty string); |
^$ | 表示匹配空白行; |
\< | 表示單詞詞首錨定,可以理解爲匹配到單詞詞首的空串(empty string); |
\> | 表示單詞詞尾錨定,可以理解爲匹配到單詞詞尾的空串(empty string); |
\b | 表示單詞邊界的錨定,可以替代\<或\>,可以理解爲匹配到單詞邊界的空串(empty string); |
\B | 表示匹配單詞邊界之外的空串(empty string); |
\w | 基本可以理解爲與[_[:alnum:]]同義,表示匹配下劃線以及字母數字字符; |
\W | 基本可以理解爲與[^_[:alnum:]]同義,表示匹配出下劃線、字母數字字符之外的字符; |
[:alnum:] | 表示字母數字字符,使用形式[[:alnum:]],如果要排除,可以配合脫字符[^[:alnum:]]; |
[:alpha:] | 表示字母字符,使用形式[[:alpha:]],如果要排除,可以配合脫字符[^[:alpha:]]; |
[:cntrl:] | 表示控制字符,使用形式[[:cntrl:]]後文有解析爲何控制字符,不常用。如果要排除,[^[:cntrl:]]; |
[:digit:] | 表示數字字符,使用形式[[:digit:]]。如果要排除,[^[:digit:]]; |
[:graph:] | 表示可打印且可見字符,後文有註解。使用形式,[[:graph:]],不常用。如果要排除,[^[:graph:]]; |
[:lower:] | 表示小寫字母字符,使用形式[[:lower:]],如果要排除,[^[:lower:]]; |
[:print:] | 表示可打印字符,使用形式[[:print:]],排除,[^[:print:]]; |
[:punct:] | 表示標點符號字符,使用形式[[:punct:]],排除,[^[:punct:]];(除了文字字符[可以理解爲字母],數字,控制字符,空格字符之外的字符) |
[:space:] | 空格字符,使用形式[[:space:]],有空格,換頁,換行,回車,橫向製表符,縱向製表符;排除[^[:space:]]; |
[:upper:] | 表示大寫字母字符,使用形式[[:upper:]],排除,[^[:upper:]]; |
[:xdigit:] | 表示16進制數字字符,使用形式[[:xdigit:]],排除,[^[:xdigit:]]; |
[:blank:] | 表示空格或橫向製表符字符,使用形式[[:blank:]],排除,[^[:blank:]]; |
grep與擴展正則表達式結合常見條目:
形式 | 說明 |
---|---|
. | 這是一個英文的點號。表示匹配任意單個字符; |
[] | 表示匹配指定範圍內的任意單個字符; |
[^] | 表示匹配指定範圍外的任意單個字符; |
* | 表示匹配前面的條目0次或多次; |
.* | 表示匹配任意長度的任意字符; |
? | 表示匹配前邊的條目至多一次,既 0次或1次; |
+ | 表示匹配前邊的條目1次或多次; |
{n} | 表示匹配前邊的條目n次,多於n次,少於n次都不可行; |
{n,} | 表示匹配前邊的條目n次或n次以上,既大於等於n次; |
{,m} | 表示匹配前邊的條目至多m次,既小於等於m次;(GNU擴展用法) |
{n,m} | 表示匹配前邊的條目至少n次,至多m次,包含n和m且m要大於等於n; |
A|B | 表示A部分或者B部分; |
(...) | 表示分組,其後可用\num對分組的內容做引用,num表示數字; |
^ | 脫字符表示錨定行首,可以理解爲匹配到的是空串(empty string); |
$ | 美元符表示錨定行尾,可以理解爲匹配到的是空串(empty string); |
^$ | 表示匹配空白行; |
\< | 表示單詞詞首錨定,可以理解爲匹配到單詞詞首的空串(empty string); |
\> | 表示單詞詞尾錨定,可以理解爲匹配到單詞詞尾的空串(empty string); |
\b | 表示單詞邊界的錨定,可以替代\<或\>,可以理解爲匹配到單詞邊界的空串(empty string); |
\B | 表示匹配單詞邊界之外的空串(empty string); |
\w | 基本可以理解爲與[_[:alnum:]]同義,表示匹配下劃線以及字母數字字符; |
\W | 基本可以理解爲與[^_[:alnum:]]同義,表示匹配出下劃線、字母數字字符之外的字符; |
[:alnum:] | 表示字母數字字符,使用形式[[:alnum:]],如果要排除,可以配合脫字符[^[:alnum:]]; |
[:alpha:] | 表示字母字符,使用形式[[:alpha:]],如果要排除,可以配合脫字符[^[:alpha:]]; |
[:cntrl:] | 表示控制字符,使用形式[[:cntrl:]]後文有解析爲何控制字符,不常用。如果要排除,[^[:cntrl:]]; |
[:digit:] | 表示數字字符,使用形式[[:digit:]]。如果要排除,[^[:digit:]]; |
[:graph:] | 表示可打印且可見字符,後文有註解。使用形式,[[:graph:]],不常用。如果要排除,[^[:graph:]]; |
[:lower:] | 表示小寫字母字符,使用形式[[:lower:]],如果要排除,[^[:lower:]]; |
[:print:] | 表示可打印字符,使用形式[[:print:]],排除,[^[:print:]]; |
[:punct:] | 表示標點符號字符,使用形式[[:punct:]],排除,[^[:punct:]];(除了文字字符[可以理解爲字母],數字,控制字符,空格字符之外的字符) |
[:space:] | 空格字符,使用形式[[:space:]],有空格,換頁,換行,回車,橫向製表符,縱向製表符;排除[^[:space:]]; |
[:upper:] | 表示大寫字母字符,使用形式[[:upper:]],排除,[^[:upper:]]; |
[:xdigit:] | 表示16進制數字字符,使用形式[[:xdigit:]],排除,[^[:xdigit:]]; |
[:blank:] | 表示空格或橫向製表符字符,使用形式[[:blank:]],排除,[^[:blank:]]; |
二、grep概述以及常用選項說明
2.1、grep概述
grep是linux常見文本處理工具之一,是我們俗稱文本處理"三劍客"工具之一,比較實用。他的功能就是打印通過指定模式(pattern)所匹配到的行。grep工具是由grep軟件包提供的,grep軟件包提供的工具其實有三個,分別是grep,fgrep,egrep,由於歷史版本原因,還保留着fgrep,egrep,不過grep可以通過加上指定的選項來使用fgrep和egrep的功能,而且官方也建議不用使用fgrep,egrep。詳細用法請參見後面部分的語法結構和選項類說明。
2.2、grep語法結構和基本選項說明(非完整版)
2.2.1、grep語法結構
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
註解部分: 其中OPTIONS表示選項,可以省略;PATTERN表示指定的模式,爲了考慮shell解析特殊符號原因,這個模式平常我們見到最多的時候是用單引號或雙引號所引起來,其實可以不用引用起來,視具體使用情況而定。PATTERN可以由-e明確指明,表明後邊部分使一個匹配所用到的模式。FILE表示所處理的目標文件,如果要從文件中讀取其他選項,可以加上-f 並後邊指明文件,正常情況我們用到最多的語法是以下這兩種:
xxx | grep 選項 '模式'
grep 選項 '模式' 被處理的文件
2.2.2、grep基本選項說明
-h:查看幫助信息
-V,--version:查看版本信息
2.2.3、grep匹配正則選擇相關的選項
-G, --basic-regexp:表示grep使用pattern部分通過基本正則語法來解析(也是默認的選項);
-E, --extended-regexp:表示grep使用pattern部分通過擴展正則語法來解析(替代來egrep這個工具);
-P, --perl-regexp:表示grep使用pattern部分通過perl正則語法來解析(grep斷言就是perl正則的語法);
-F, --fixed-strings:表示grep使用pattern部分不使用正則表達式解析,就當做一般搜索過濾的字符串(替代來fgrep
這個工具);
2.2.4、grep匹配控制相關的選項
-e PATTERN, --regexp=PATTERN:這個是POSIX風格的選項,表示顯式指明-e表明後邊是一個PATTERN,
可以有多個這樣的選項;
-f FILE, --file=FILE:這個是POSIX風格的選項,表示通過在指定的文件中指定grep要使用的pattern,這個文件
的語法爲,每行一個pattern,如果指定來-f或--file選項且文件內容爲空,表示沒有任何pattern,表示不做任何
處理(POSIX風格的選項);
-i, --ignore-case:表示pattern匹配的部分忽略字符串大小寫(POSIX風格的選項);
-v, --invert-match:表示反選匹配的內容。默認是匹配到的行才輸出,反選後打印不匹配的行(POSIX風格的選項);
-w, --word-regexp:表示只匹配精確的單詞(由字母,數字,下劃線組成),特殊字符(不是字母,數字,下劃線)可以
起到分隔單詞的作用,具體示例演示會更加明白;
-x, --line-regexp:表示全行完全匹配纔打印出來(POSIX風格的選項);
2.2.5、grep匹配通用輸出選項
-c, --count:只輸出匹配的行或者目標的數量;
--color[=WHEN], --colour[=WHEN]:控制輸出顏色,可選參數never(表示不帶顏色),always,auto(表示帶顏色);
-l, --files-with-matches:只打印匹配到的文件名;
-m NUM, --max-count=NUM:表示匹配多少行文本後退出,不管是否有匹配到;
-o, --only-matching :打印僅僅匹配到的行中的內容而不是一整行都輸出;
-q, --quiet, --silent:安靜模式,可以通過分析命令退出狀態來判斷是否匹配到來內容
2.2.6、grep輸出行前綴選項
-n, --line-number:給輸出的文本前邊加上行號標記,行號與原始文本所在行保持一致;
2.2.7、grep控制匹配輸出上下文選項
-A NUM, --after-context=NUM:除了匹配到的行輸出,也輸出匹配到行的後NUM行;
-B NUM, --before-context=NUM:除了匹配到的行輸出,也輸出匹配到行的前NUM行;
-C NUM, -NUM, --context=NUM:除了匹配到的行輸出,也輸出匹配到行的前NUM行和後NUM行;
小貼士:如果前後的行不夠,就保持默認,比如如果前面沒有2行,而指定了-B 中的NUM等於2,就
有多少行輸出多少行,-A和-C選項同理;
2.2.8、grep文件和目錄選擇相關選項
--include=GLOB:僅僅從GLOB匹配的文件中去搜索;
-r, --recursive:遞歸查找,對於如果指明的文件爲符號鏈接文件,會去檢索,如果是其他匹配到的符號鏈接文件
例如 .下剛好有個符號鏈接文件,這種情況,符號鏈接文件就會被跳過,也就是說-r如果要檢索到的文件也包括
符號鏈接文件本身,要去顯示在命令行上指明這個符號鏈接文件;
-R, --dereference-recursive:遞歸查找,與-r的區別在於是否檢索符號鏈接文件,這個就是不管是什麼情況,只
要符號鏈接文件有滿足的,都會被檢索出來;
2.3、grep的標準正則與擴展正則語法說明
2.3.1、正則表達式的概述
正則表達式(REGEXP,Regular Expression)指的是由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示其字面意義,而是用於控制和通配的功能。它類似於算術表達式,通過使用各種運算符來組合微小的表達式。grep工具所支持正則表達式的有三類,分別是:基本正則表達式(BRE,Basic Regular Expression),擴展正則表達式(ERE,Extended Regular Expression)以及perl正則表達式(Perl's Regular Expression);就其功能實現來講,grep所支持的正則表達式,基本的正則表達式與擴展的正則表達式所能實現的功能幾乎無差異,都可以相互轉換,只是表達形式略有不同而已。可能其他應用程序所實現的正則表達式語法,擴展正則表達式語法要比基本正則表達式語法功能實現要強,不過我們這裏不加贅述。不過Perl所能實現的正則表達式語法要比前兩者都要強大而且複雜。
不管正則表達式是否真如它所描述的這樣神祕,我們理解起來無非是不同的字符的組合,就其字符本身,並沒有新的東西,無非是定義來一些特定格式的組合用來表述其不同的含義。匹配單個字符是正則表達式是用來匹配一個組成代碼塊的基礎,可以理解爲,大部分的字符,包括所有的字母,通過可以都通單個字符組成的代碼塊的組合來匹配。任何在正則表達式中具有特殊含義的元字符都可以反斜槓(轉移字符)來引用。元字符(meta-characters)大概有以下這些:
?,+,{,|,(,)等
正是由於這些元字符的引入,才讓正則表達式有了豐富的含義和神祕感,而且這些特定元字符在基本正則表達式以及擴展正則表達式中表現形式略有不同,簡單來說就是基本正則表達式中要用到這些特定元字符要轉移,而擴展正則表達式中表示則不用,具體後面小節中會舉例引用說明。
2.3.2、與大括號組合的字符類匹配
一組大括號表達式是由[和]括起來的一系列字符。表示匹配這個括號內所有字符中的任意單個字符。如果裏面的第一個字符是^,表示匹配排除括號內的所有字符之外的任意單個字符,例如[0123456789]表示匹配0到9這10個數字中的任意一個數字,而[^0123456789],表示出了數字之外,其他任意的單個字符。簡單表示形式如下:
[]:表示匹配括號內任意的單個字符;
[^]:表示匹配除了括號內字符以外的任意單個字符;
在大括號的表達式中,一個範圍表達式的組成,由兩個字符中間加上一個減號(-)相連接,例如像[a-z],[2-9]等。這個字符序列,邊界,左邊的值和右邊的值要按照一定的順序,比如常見的[a-z]就不能寫成[z-a],[0-9]不能寫成[9-0],可以很簡單的理解成從小到大,左邊的字符值要比右邊的小,而且要連續。在我們常見的linux,unix環境中,一般的locale校驗,都是大小寫敏感,所以[a-d]一定是表示[abcd],但是針對不同的系統的locale值,可能[a-d]可能表示爲[aAbBcCdD],不過後者我們不用關係。簡單表示形式如下:
[start-stop]:表示一組連續的字符,我們可以中間加上一個減號來連起來,表示取這一組範圍內的任意單個字符;
其中start不管是數字還是字符,都應該在stop前,例如a在b前,a在c前,0在9前。所以常見表示有:
[a-z]:表示匹配所有小寫字母(還是隻匹配單個字符,連續26個小寫字母中的任意單個字符);
[A-Z]:表示匹配所有大寫字母(還是隻匹配單個字符,連續26個大寫字母中的任意單個字符);
[0-9]:表示匹配所有數字(還是隻匹配單個字符,連續10個數字中的任意單個數字字符);
[a-zA-Z]:表示匹配所有字母字符(還是隻匹配單個字符);
[a-zA-Z0-9]:表示匹配字母數字字符(也是匹配括號內任意單個字符);
當然,也可以這樣寫[6-9],[c-f]等;
除了以上兩種形式之外,還有一組POSIX風格的組成,都有其特定含義:
[:lower:]:小寫字母字符;
[:upper:]:大寫字母字符;
[:alpha:]:字母字符(大小寫字母);
[:digit:]:數字字符;
[:xdigit:]:16進制的數字字符;
[:alnum:]:字母數字字符;
[:cntrl:]:控制字符;
[:graph:]:可打印且可見字符(空格屬於可打印字符,但是它不可見);
[:print:]:可打印字符(控制字符都不可打印)
[:punct:]:標點符號字符(除了文字字符[可以理解爲字母],數字,控制字符,空格字符之外的字符);
[:space:]:空格字符,包括:空格(' '),ascii碼錶換頁字符('\f'),ascii碼錶換行字符('\n'),ascii碼錶回車字符('\r')
ascii碼錶橫向製表符('\t'),ascii碼錶縱向製表符('\v');
[:blank:]:空格(' ')或橫向製表符字符('\t');
上面中的[]是一個整體,是和中間的字符串一起組成表示一類特定含義的,如果要使用,要配和再加一層大括號,
例如[^xxx],[...],其中xxx和...就可以引用這些特定的命名類,[^[:alnum:]]表示除了[:alnum:]匹配的到的之外的,
[[:alnum:]]表示[:alnum:]匹配到的,在於這種特殊類的一起配和使用的時候,並且在大括號中,有些特殊要
記憶的東西,比如[_[:alpha:]]這種用法,就除了匹配[:alpha:]匹配到的之外,還包括了下劃線字符。那麼如果
對於要匹配像"[","]","^","-"本身的含義,書寫位置是有講究的,分別可以這樣設置:[^a-z^],[a-z-]或
[-a-z],[a-z[],[]a-z]等。
2.3.3、位置錨定和特殊字符組合
錨定字符,其中有兩個元字符,一個脫字符(^)表示錨定行首,一個是美元符($)表示錨定行尾;
與位置錨定字符相似的有一個特殊的表示,由右斜槓"\"組合特殊字符"<"或">"所構成,分別爲:
\<:表示匹配單詞的行首;
\>:表示匹配單詞的行尾;
而另外有幾個比較特殊的,也是由\一般字母字符所組成,分別爲:
\b:表示匹配單詞的邊界,邊緣;(可以用來替代\<和\>做單詞詞首和詞尾錨定用);
\B:表示除了單詞邊緣空串之外的所有空串;
\w:與[_[:alnum:]]同義,表示匹配下劃線,字符,數字字符;
\W:與[^_[:alnum:]]同義,表示匹配非下劃線,字母數字字符;
2.3.4、匹配次數相關
?:表示前邊的條目匹配至多一次(0次或1次);
*:表示前邊的條目匹配0次或多次;
+:表示前邊的條目匹配1次或多次;
{n}:表示前邊的條目精確匹配n次,多於n和少於n次都不行;
{n,}:表示前邊的條目匹配n次或n次以上;
{,m}:表示前邊的條目匹配至多m次,小於等於m,這個是GNU擴展用法(有時候不一定可行,非標準);
{n,m}:表示前邊的條目匹配至少n次,至多m次;
2.3.5、級聯與交替
級聯(Concatenation)簡單來說就是可以多個pattern分開組合在一起來完成特定的工作,例如$'\t'' '表示匹配一個
橫向製表符與後邊的一個空格字符組合的結果;
交替(Alternation)表示二者可選值,可以利用符號|來組合左邊和右邊的部分,用來匹配左邊或右邊的部分,表示
形式如下:
X|Y:匹配X或匹配Y;
2.3.6、分組與後向引用以及優先順序
分組就是把特定的pattern用小括號"()"所引起來,用來作爲一個整體,也可以理解爲把一個或多個字符串綁定在
一起。例如(^xy)+ab,這樣元字符"+"修飾的就是分組內的一個整體了。
後向引用:表現形式爲 \n,其中n是數字,表示引用前面正則表達式匹配的以小括號()引用起來的子串部分,
表示反向引用或後向應用。例如:
([^a-z])a.*\1其中()中的內容是一個子pattern,\1就是引用這個子pattern匹配到的部分;()可以嵌套使用,
不過不具備交叉性,即([^a-z]a([[:alnum:]]*)) 其中括號不能相交引用;
2.3.7、基本正則表達式與擴展正則表達式的比較
在基本正則表達式中,元字符(?,+,{,|,(,) ),如果不加轉移字符使用,只會表示符號本身含義,不會作爲正則
元字符含義,所以如果要作爲特殊元字符含義,比如表現爲以下形式
\?
\+
\{
\|
\(
\)
而在擴展正則表達式語法中(使用egrep或者grep -E或grep --extended-regexp),這些元字符可以直接使用:
?
+
{
}
(
)
2.4、關於grep使用斷言語法基本解析(選讀)
三、grep使用示例分析與說明
3.1、字符匹配基礎用法
3.1.1、基本字符串匹配的行
3.1.2、打印行號
3.1.3、只輸出匹配到的部分
3.1.4、輸出匹配到行的數量
3.1.5、反向匹配的結果
3.1.6、匹配忽略大小寫
3.1.7、只匹配單詞行和精確單詞行
這裏有個概念要知道一下,單詞是有特殊字符分隔的,比如常見的冒號,逗號,空白符號等。而單詞是由字母,數字,下劃線組成;-w選項指明後,如果一個字符串,例如rootkit:124,root:123,那麼前者"rootkit:124"就不會被匹配到,後者"root:123"纔會被匹配到。請看示例: