1. 程式人生 > >正則表達式,grep/egrep工具的使用

正則表達式,grep/egrep工具的使用

目錄 查詢 日常 計算機 pri com 完成 term col

正則表達式,又稱規則表達式,英文名為Regular Expression,在代碼中常簡寫為regex、regexp或RE,是計算機科學的一個概念。正則表通常被用來檢索、替換那些符合某個模式(規則)的文本。
在計算機科學中,正則表達式是這樣解釋的:它是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。在很多文本編輯器或其他工具裏,正則表達式通常被用來檢索和/或替換那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字符串操作。對於系統管理員來講,正則表達式貫穿在我們的日常運維工作中,無論是查找某個文檔,抑或查詢某個日誌文件分析其內容,都會用到正則表達式。
其實正則表達式,只是一種思想,一種表示方法。只要我們使用的工具支持表示這種思想那麽這個工具就可以處理正則表達式的字符串。常用的工具有grep, sed, awk 等。


grep/egrep工具的使用

grep(global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
命令的格式為:

grep [選項] ‘word‘ filename

選項(加粗為常用選項):

-a: 不要忽略二進制數據。
-A<顯示列數> :除了顯示符合範本樣式的那一行之外,並顯示該行之後的內容。
-B: 在顯示符合範本樣式的那一行之外,並顯示該行之前的內容。
-c: 計算符合範本樣式的列數。
-C<顯示列數>或-<顯示列數>: 除了顯示符合範本樣式的那一列之外,並顯示該列之前後的內容。


-d<進行動作>: 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep命令將回報信息並停止動作。
-e<範本樣式>: 指定字符串作為查找文件內容的範本樣式。
-E: 將範本樣式為延伸的普通表示法來使用,意味著使用能使用擴展正則表達式。
-f<範本文件>: 指定範本文件,其內容有一個或多個範本樣式,讓grep查找符合範本條件的文件內容,格式為每一列的範本樣式。
-F: 將範本樣式視為固定字符串的列表。
-G: 將範本樣式視為普通的表示法來使用。
-h: 在顯示符合範本樣式的那一列之前,不標示該列所屬的文件名稱。
-H: 在顯示符合範本樣式的那一列之前,標示該列的文件名稱。
-i: 忽略字符大小寫的差別。
-l: 列出文件內容符合指定的範本樣式的文件名稱。
-L: 列出文件內容不符合指定的範本樣式的文件名稱。
-n: 在顯示符合範本樣式的那一列之前,標示出該列的編號。
-q: 不顯示任何信息。
-R/-r: 此參數的效果和指定“-d recurse”參數相同。
-s: 不顯示錯誤信息。
-v: 反轉查找。
-w: 只顯示全字符合的列。
-x: 只顯示全列符合的列。
-y: 此參數效果跟“-i”相同。
-o:只輸出文件中匹配到的部分。

實例:
1、打印出包含root的行以及這行下面的兩行,並且輸出行號:
技術分享圖片
2、過濾不帶關鍵詞“root”的行,並輸出行號:
技術分享圖片
3、過濾出所有包含數字的行:
技術分享圖片
4、過濾掉所有包含數字的行:
技術分享圖片
5、過濾掉以#開頭的行:
技術分享圖片
6、過濾掉以#開頭的行並且過濾掉空行:
技術分享圖片
在正則表達式中, “^” 表示行的開始, “$” 表示行的結尾,那麽空行則可以用 “^$” 表示。
在這個試驗中,如果加上-n選項,效果會無效,這個可以自行實驗!
7、打印出不以英文字母開頭的行:
技術分享圖片
‘[ ]’ 的應用,如果是數字的話就用[0-9]這樣的形式,當然有時候也可以用這樣的形式[15]即只含有1或者5,註意,它不會認為是15。如果要過濾出數字以及大小寫字母則要這樣寫[0-9a-zA-Z]。另外[ ]還有一種形式,就是[^字符] 表示除[ ]內的字符之外的字符
8、過濾出任意一個字符和重復字符:
技術分享圖片
“.”表示任意一個字符,上例中,就是把符合r與o之間有兩個任意字符的行過濾出來, * 表示零個或多個前面的字符。
技術分享圖片

‘*‘表示零個或多個‘*‘前面的字符。
9、指定要過濾出的字符的出現次數:
技術分享圖片
這裏用到了{ },其內部為數字,表示前面一個字符要重復的次數。上例中表示包含有兩個o 即 ‘oo’ 的行。註意,{ }左右都需要加上脫意字符 ‘\’, 另外,使用{ }我們還可以表示一個範圍的,具體格式是 ‘{n1,n2}’ 其中n1小於n2,表示重復n1到n2次前面的字符,n2還可以為空,則表示大於等於n1次。


上面部分講的grep,另外常常也會用到egrep這個工具,簡單點講,後者是前者的擴展版本,我們可以用egrep完成grep不能完成的工作,當然了grep能完成的egrep完全可以完成。如果你嫌麻煩,egrep了解一下即可,因為grep的功能已經足夠可以勝任你的日常工作了。下面介紹egrep不同於grep的幾個用法。
1、過濾出一個或多個指定的字符:
技術分享圖片
和grep 不同的是,egrep這裏是使用’+’的,它表示匹配1個或多個‘+’前面的字符,不支持被grep直接使用。
egrp可以直接使用"{}",而不用加轉義字符"\":
技術分享圖片
2、過濾出零個或一個指定的字符:
技術分享圖片
3、過濾出字符串root或者字符串1234:
技術分享圖片
4、()的使用:
技術分享圖片
用( )表示一個整體,例如(oo)+就表示1個 ‘oo’ 或者多個 ‘oo’。

正則表達式,grep/egrep工具的使用