Linux grep正則表達式的用法,學好即可旁通其他語言正則表達式
編輯:狂族晨曦 來源:腳本編程,系統運維,經驗雜筆 日期:2016-05-15 閱讀: 4,649 次 9 條評論 » 百度已收錄
先森培訓紅帽Linux之前,得知要也會教正則表達式,先森是感到非常高興的。因為在先森的印象中,正則表達式是非常難懂難學的,既然有教,一定要學好。本來已經做好面對困難的決心,直到老師教grep正則表達式的時候才發現,原來這么簡單。而且老師也說了,只要學會了用grep正則表達式,學習java等其他語言的正則表達式也就簡單了。

redhat linux grep
下面先森對自己的學習做一個總結,畢竟代碼總是易忘的。本文敘述的是用grep來使用正則表達式,實際上Linux使用正則表達式的命令工具不止于此。
Linux grep命令
grep是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。grep很有使用價值,先森在學習之后就在《用Linux分析日志查看產生大量404的IP》一文中有過應用。
grep按下述方式接受選項和參數:
grep [options] regex [files]
其中options是以下的選項,regex是正則表達式,files是需要進行搜索的文本文件。gerp支持的選項如下:
-
-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 只輸出文件中匹配到的部分。
-
--color:以特定顏色高亮顯示匹配關鍵字
--color選項可以讓搜索匹配結果高亮,是個很有用的選項。
需要注意的是,grep命令使用正則表達式分為基本正則表達式和擴展正則表達式。我們一般使用"grep -E"或者"egrep"來使用擴展正則表達式。擴展正則表達式的功能更加強大。
命令中加入正則表達式時,最好使用引號將表達式括起來,以避免shell的元字符對正則表達式的影響。
基本正則表達式
正則表達式的學習,主要就是對各種字符的作用進行學習,使用中則主要是將各種功能的字符進行組合,以達到我們的目標匹配。雖然grep正則表達式分為基本正則表達式和擴展表達式,但基本表達式已經能滿足我們的基本需求了。下面來介紹一下各種正則表達式字符:
| 符號 | 含義 | 舉例 |
| ^ | 開始標記 | "^abc"滿足的例子abc、abcd |
| ^ | 非(在[]內) | "[^abc]"滿足的例子:ddd、mpd |
| $ | 結束標記 | "abc$"滿足的例子abc、mmabc |
| \< | 匹配單詞開始 | "\<abc"滿足的例子abc、abcd |
| \> | 匹配單詞結束 | "abc\>"滿足的例子abc、pmrabc |
| . | 任意一個字符 | "a.c"滿足的例子abc、fapcc |
| * | 匹配前一個字符≥0次 | "abc*"滿足的例子abbb(c出現0次)、abcdk |
| \ | 轉義字符 | "\."滿足的例子192.168 |
| [] | 匹配一系列字符中的一個 | "[abc]"滿足的例子any、boy、ico |
| - | 連字符,用在[]中,規定匹配范圍 | [a-z]匹配小寫字母,[0-9]匹配數字,[0-9a-zA-Z]匹配數字與字母 |
| {} | {m}、{m,n}、{m,}、{,n}分別為匹配前一個字符m次、m到n次、≥m次、≤n次 |
"abc\{3,5\}"滿足的例子abcccc、abcccccc 注意,由于{ }在SHELL中有特殊意義,因此作為正則表達式用的時候要用\轉義一下(若用egrep則不轉義)。 |
擴展正則表達式
grep一般情況下支持基本正則表達式,可以通過參數-E支持擴展正則表達式。所以grep單獨提供了一個擴展命令叫做egrep用來支持擴展正則表達式,這條命令和grep -E等價。雖然一般情況下,基本正則表達式就夠用了。特殊情況下,復雜的擴展表達式,可以簡化字符串的匹配。
擴展正則表達式就是在基本正則表達式的基礎上,增加了一些匹配字符。
| 符號 | 含義 | 舉例 |
| + | 匹配前一個字符≥1次 | "abc+"滿足的例子abcd、abcccdd |
| ? | 匹配前一個字符0或1次 | "abc?"滿足的例子ab、mabcd |
| | | 或 | "AAA|BBB"滿足的例子AAA、BBBpp |
| () |
匹配整個括號內的字符串(原來都是匹配單個字符) |
"g(oo|la)d"滿足的例子good、glad |
| () | 反向引用,最多使用9次,用\*調用(*代表1-9),以左括號確定編號 | "([a-z]+)([0-9]+)\1\2\1"(\1引用第一個括號內的匹配結果,\2引用第二個括號的匹配結果)滿足的例子abc12abc12abc、a1a1a(注:a1a2c則不滿足) |
最后
相對而言,grep正則表達式還是非常簡單的。需要注意的是,花括號{}在grep中使用需要加反斜杠\轉義,而在grep -E或egrep中則不用轉義。
轉載請注明出處來自http://www.cnidcc.cn/linux_grep_zzbds.html

川公網安備 51011202000104號
正則表達式萬變不離其宗
你們這做技術的太牛了,寫的這些完全看不懂啊!
最煩的就是這些東西呀
@純潔博客: 但是確實好用啊
正則參數這么多,看著都暈0.0
一直不是很懂正則表達式。看很多時候都會用到的。
太難掌握了~~
以前學Java時用過,現在都還給老師了。
正則的確很強大~