先了解下基礎概念:字符是計算機軟件處理文字時最基本的單位,可能是字母,數字,標點符號,空格,換行符,漢字等等。字符串是0個或更多個字符的序列。文本也就是文字,字符串。說某個字符串匹配某個正則表達式,通常是指這個字符串裡有一部分(或幾部分分別)能滿足表達式給出的條件。
正則表達式:是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。vim、grep、awk 、sed 等工具都支持正則表達式,本文介紹如何使用grep及egrep命令。而擴展正則表達式比基本正則表達式擁有更強大的功能。
簡介
grep的主要功能用於檢索文件內容,字符串等的工具。可以根據用戶指定的“模式(pattern)”對目標文本進行搜索過濾,顯示出被“模式pattern”匹配到的行。
其基本語法是:
grep [OPTIONS]PATTERN [FILE...]
PATTERN:是文本字符和正則表達式的元字符組合而成的匹配條件,可用單引號‘ ’將pattern括起來以避免shell通配的影響,強引用不替換而顯示字符本身。" " 雙引號,字符串中的` ` ,$, \ 等特殊字符會被shell解釋替換後,再傳遞給grep。對普通的字符串(沒有特殊字符和空格的字符串)也可以不加引號,直接搜索。
OPTIONS:(這裡給出常用的選項)
-i 忽略大小寫
-c 顯示被匹配到的行數
-n 輸出行號
-v 反向選擇,即找沒有搜索字符串的行
-o 僅顯示匹配到的內容
-w 匹配單詞
-A # 連同匹配行的下#行一並顯示,#代表任意數字
-B # 連同匹配行的上#行一並顯示,#代表任意數字
-C # 連同匹配行的上下#行一並顯示,#代表任意數字
-R或-r 遞歸搜索目錄或子目錄下匹配的字所在文件(可配合find命令
-E 相當於egrep 支持擴展的正則表達式
-F 相當於fgrep 不支持正則表達式
--color對匹配的內容以顏色顯示
-V 顯示grep版本
grep中不太常用的選項:
-P, --perl-regexp PATTERN 是一個 Perl 正則表達式
-q取消顯示,只返回退出狀態。0則表示找到了匹配的行;找不到返回1,搜索的文件不存在返回2
-h --no-filename #在顯示符合樣式的那一列之前,不標示該列所屬的文件名稱。
-H --with-filename #在顯示符合樣式的那一列之前,表示該列所屬的文件名稱。(默認方式)
-L:輸出時只顯示不包含匹配項的文件名,通常與-r選項連用來查找帶指定內容的文件。
-l:輸出時只顯示包含匹配項的文件名。
正則表達式: 默認匹配次數:貪婪模式,盡可能多的去匹配
. 匹配任意單個字符
\.表示.本身 \逃逸符
* 匹配其前面的字符任���次可為0次
.* 任意長度的任意字符
\? 匹配其前面字符1次或0次
x\{m\}:匹配其前面的字符“x”m次(精確匹配)
x\{m,\}:匹配其前面的字符“x”至少m次
x\{m,n\}:匹配其前面的字符“x”至少m次,至多n次
\{1,\} 1次至無上限 \{0,3\}至少3次
^ 錨定行首,此字符後面的任意內容必須出現在行首
$ 錨定行尾,次字符前面的任意內容必須出現在行尾
^$表示空行
[ ] 匹配指定范圍內的任意單個字符
[^ ] 匹配指定范圍外的任意單個字符
\< 其後面的任意字符必須作為單詞的首部出現 \b
\> 其前面的任意字符必須作為單詞的尾部出現 \b
\<\> 錨定單詞例如 \<root\>
純數字 [[:digit:]]或[0-9]
小寫字母 [[:lower:]]或[a-z]
大寫字母 [[:upper:]]或[A-Z]
大小寫字母 [[:alpha:]]或[a-zA-Z]
數字加字母 [[:alnum:]]或[0-9a-zA-Z]
空白字符 [[:space:]] 非空白字符[^[:space:]]
標點符號 [[:punct:]]
\d 匹配任何十進制數,相當於[0-9] -P選項加上
\D 匹配任何非數字字符,相當於[^0-9] -P選項加上
\s 匹配任何空白字符,
\S 匹配任何非空白字符,
\w 匹配任何字母數字字符,相當於[a-zA-Z0-9]
\W 匹配任何非字母數字字符,相當於[^a-zA-Z0-9]
\\ 匹配"\"
\( \) 分組後項引用 \1 引用第一個左括號以及與之對應的右括號所包括的所有內容。 \2 \3 …
擴展正則表達式中增加了幾個與正則表達式有區別的新內容:
+ 匹配其前面的字符至少1次 \{1,\}正則中近似
? 匹配緊挨在其前面的字符0次或1次 \?正則中
{m,n} 匹配前面字符至少m次至多n次 {1,}表示1至無限 {0,3}表示0-3
()分組 \1 \2 \3 …
| 或者
2. 舉例說明
這裡的-n顯示了行號 n.表示n後面跟0-1個字符
\.轉義符
這裡的-i忽略了匹配字符的大小寫 o後面跟了…有3個字符被匹配到
-v忽略匹配項
nt* 表示匹配以n為開頭後面可以沒有t個字符,也可以出現多次
匹配on後面跟的任意長度字符
雖然可以用wc –l 顯示行號但是比起-c來說慢了一點!-w匹配單詞
錨定行首
列出非目錄的行 total是啥?
錨定行尾
查找目錄下文件中匹配的詞
錨定詞首
錨定詞尾
在/etc/passwd文件中查找匹配o,並且至少出現2次的字符串的行。
顯示文件中任意數字,左右有:號
顯示以#開頭的行後面跟一個或多個空白字符,且後面跟了任意非空白字符的行
顯示非數字字母的字符
分組中grep和egrep的區別
顯示root開頭或bash結尾的行(擴展正則表達式獨有)
這個7在文件內沒有返回值為1,若是6在文件內有則返回0,大該編程有用吧!
演示到這裡我的color沒有在命令中顯示為何會展示出顏色呢?其實我用的是alias別名啦,如圖所示: 當然可以不用別名,在grep前面加個\ 即可。
fgrep不支持正則表達式也就不舉例了。雖然例子不多也比較基礎,以後還會補上點實用的內容。若有不對請指出!
補充內容:
懶惰限定符
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
Linux正則表達式特性及BRE與ERE的區別 http://www.linuxidc.com/Linux/2014-03/99152.htm
grep使用簡明及正則表達式 http://www.linuxidc.com/Linux/2013-08/88534.htm
正則表達式的用法 http://www.linuxidc.com/Linux/2013-03/81897.htm
正則表達式之零寬斷言 http://www.linuxidc.com/Linux/2013-03/81897.htm
Linux中正則表達式與文件格式化處理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm
基礎正則表達式 http://www.linuxidc.com/Linux/2014-09/106296.htm
常用正則表達式整理 http://www.linuxidc.com/Linux/2014-10/108076.htm