介紹Linux系統中的兩個命名:grep,egrep。要想使用這2個指令要先學會使用正規表達式,在介紹正規表達式之前,先說明一下,大家都熟知的在word中使用的通配符,即:
*:表示任意長度任意字元。
?:表示任意單個字元。
記住上面這兩個字元所表示的意思,後面還會在正規表達式裡出現,但意義不同。
由一類特殊字元及文本字元所編寫的模式,其有些字元不表示字面意義,而是用于表示控制或通配的功能;
元字元分兩類:
基本正規表達式:BRE
擴充的正規表達式:ERE
正規表達式引擎是利用正規表達式模式分析給定的文本的程式,在上億機關的文本搜尋時,有明顯優勢。
(1)grep:Global search REgular expression and Print out the line;預設支援使用BRE基本正規表達式;
(2)egrep:支援使用擴充正規表達式;
(3)fgrep:不支援使用正規表達式;
作用:文本搜尋工具,根據使用者指定的pattern(過濾條件)對目标文本逐行進行比對檢查;列印出符合條件的行;
模式:有文本字元及正規表達式元字元所編寫的過濾條件;
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE][FILE...]
--color=auto:對比對到的文本着色高亮顯示;
-i:忽略字元大小寫;
-o:僅顯示比對到的文本自身;(預設顯示比對到的文本整行)
-v,--invert-match:反向比對;
-E,--extened-regexp:支援擴充的正規表達式;相當于egrep指令,對grep和fgrep有用;
-F,--fixed-strings:相當于fgrep指令;
-q,--quiet,--silent:靜默模式,不輸出任何資訊;取指令執行狀态碼時常用;
-G,--basic-regexp:支援使用基本正規表達式,對egrep和fgrep有用;
-P,--perl-regexp:支援使用pcre正規表達式(支援元字元很多,非常強大);
-e PATTERN,--regexp=PATTERN:使用多模式;
-f FILE,--file=:FILE為每行包含了一個pattern的文本檔案,即grepscript;把模式寫在一個檔案裡,通過讀取檔案(腳本檔案),來比對;
-c:顯示統計比對到的行數;
-r,--recursive:對目錄下所有檔案裡的内容根據模式比對;
-A #,--after-context=#:表示顯示比對到行的後面#行;
-B #,--before-context=#:表示顯示比對到行的前面#行;
-C #,-#,--context=#:表示顯示比對到行的前後#行;
例如:
~]# grep 'root' /etc/passwd:如果模式裡有變量要用雙引号;
~]# grep -v 'root' /etc/passwd:反向比對;
~]# grep -i 'root' /etc/passwd:忽略字元大小寫;
~]# grep -o 'root' /etc/passwd:僅顯示比對到的文本自身;
~]# grep -q 'root' /etc/passwd:靜默模式;
~]# echo $?;取指令執行狀态碼時常用;
~]# grep -e "r..t" -e"bash" /etc/passwd:使用多模式;
~]# grep -f /root/test/mypat /etc/passwd:使用比對儲存在檔案裡的模式;
~]# grep -A 1 "^[op]" /etc/passwd:顯示比對到的行後面的一行;
~]# grep -B 2 "^[op]" /etc/passwd:顯示比對到的行前面的兩行;
~]# grep -C 1 "^[op]" /etc/passwd:顯示比對到的行前後各一行;
模式用引号引起來,有變量時用單引号;
.:比對任意單個字元;
[]:比對範圍内的任意單個字元;(同glob機制)
[^]:比對範圍外的單個字元;
[:digit:]:任意單個數字;
[:lower:]:任意單個小寫字母:
[:upper:]:任意單個大寫字元;
[:alpha:]:任意單個字母;
[:alnum:]:任意單個字母和數字
[:space:]:任意單個空白字元;
[:blank:]:任意單個空格和tab;
[:punct:]:任意單個标點符号;
[:cntrl:]:任意單個控制符;
[:graph:]:任意單個能顯示的符号;
[:print:]:任意單個可列印符号;
[:xdigit:]:任意單個十六進制字元;
man 7 glob檢視字元集範圍;
~]# ifconfig | grep "r..":r後跟兩個字元的行;
~]# ifconfig | grep -i"i[a-z][a-z]":不區分大小寫,i後跟兩個字母的行;
~]# ifconfig | grep "i[[:alpha:]][[:space:]]":i後跟一個字母再跟一個空格的行;
用在要指定其出現的次數的字元後面,用于限制其前面的字元要出現的次數,預設工作在貪婪模式;
*:比對前面的字元出現的任意次(0,1或多次);
grep "x*y":隻要有y就比對;
xxxyabc
yab
abcxy
abcy
.*:比對任意長度的任意字元,相當于glob中的*;
grep "x.*y":在x和y之間可出現任意長度任意字元即比對;
\+:比對前面的字元至少1次(1次或多次);\為轉義符;
grep "x\+y":y之前必須出現一個x;
\?:比對前面的字元0次或1次,即前面的字元可有可無;
grep "x\?y":隻要有y就比對;
\{m\}:比對其前面的字元出現m次,m為非負整數;
grep "x\{2\}y":y前出現2次x就比對;
\{m,n\}:比對其前面的字元出現m次,m為非負整數;閉區間[m,n]
\{0,n\}:至多n次;
\{m,\}:至少m次;
~]# ifconfig | grep"i[[:alpha:]]\{3\}":比對i後跟3個字母的行;
~]# ifconfig | grep"i[[:alpha:]]\{3,\}":比對i後跟至少3個字母的行;
限制使用模式搜尋文本,限制模式所比對到的文本隻能出現于目标文本的哪個位置;
^:行首錨定;用于模式的最左側,^PATTERN;
$:行尾錨定;用于模式的最右側,PATTERN$;
^PATTERN$:要讓PATTERN完全比對一整行;
^$:比對空行;
^[[:space:]].*$:比對空白行;
~]# grep "^r..t" /etc/passwd:比對r開頭後跟兩個字元再跟t的行;
~]# grep "l.\{3\}n" /etc/passwd:比對l後跟3個字元再跟n的行;
~]# grep "l.\{3\}n$" /etc/passwd:比對l後跟3個字元再跟n結尾的行;
~]# grep "^l.\{3\}n$" /etc/passwd:比對隻能是l開頭後跟3個字元再跟n結尾的行;
~]# grep "[[:space:]]\+" /etc/passwd:比對至少連續出現一個空格的行;
單詞:非特殊字元組成的連續字元(字元串)都稱為單詞;
\<或\b:詞首錨定,用于單詞模式的左側,格式為\<PATTERN,/bPATTERN;
\>或\b:詞尾錨定,用于的承諾模式的右側,格式為PATTERN\>,PATTERN\b;
~]# grep "\<r..t" /etc/passwd:比對單詞詞首:r後跟兩個字元再跟t的的行;
~]# grep "\<r..t\>"/etc/passwd:比對單詞:r後跟兩個字元再跟t的行;
~]# ifconfig | grep"\<[0-9]\{3\}\>":比對單詞:三個數字;
\(PATTERN\):将此PATTERN比對到的字元當作一個不可分割的整體進行處理;
注意:分組括号中的模式比對到的字元會被正規表達式引擎自動記錄于内部變量中,這些變量是\1,\2,\3,...
例如:pat1\(pat2\)pat3\(pat4\(pat5)pat6\)
\n:模式中的第n個左括号以及與之比對的右括号之間的模式所比對到的字元串;(不是模式,而是模式比對的結果)
\1:表示第一組括号總的PATTERN比對到的的字元串;上例:pat2
\2:表示第二組括号總的PATTERN比對到的的字元串;上例:pat4\(pat5)pat6
\3:表示第三組括号總的PATTERN比對到的的字元串;上例:pat5
...
示例:
he love his lover
he like his lover
he love his liker
he like his liker
.*l..e.*l..er
\(l..e\).*\1r
~]# grep -o 'l..e.*l..er' fenzu_pattern.txt:不能完成精确比對;
~]# grep -o '\(l..e\).*\1r'fenzu_pattern.txt:分組可完成精确比對;
後向引用:引用前面的括号中的模式所比對到的字元串;
支援使用擴充的正規表達式的grep指令,相當于grep -E;
egrep [OPTIONS] PATTERN [FILE...]
選項同grep;
[]:比對範圍内的任意單個字元;
[:space:]:任意單個空格;
[:blank:]:任意單個空格和tab
*:比對前面的字元(可有可無)出現的任意次(0,1或多次);
?:比對前面的字元0次或1次,即前面的字元可有可無;
+:比對前面的字元至少1次(1次或多次);
{m}:比對其前面的字元出現m次,m為非負整數;
{m,n}:比對其前面的字元出現m次,m為非負整數;[m,n]
{0,n}:至多n次;
{m,}:至少m次;
^$:比對空行
\<,\b:詞首錨定,用于單詞模式的左側,格式為\<PATTERN,/bPATTERN;
\>,\b:詞尾錨定,用于的承諾模式的右側,格式為PATTERN\>,PATTERN\b;
(pattern):分組,括号中的模式比對到的字元會被存儲于正規表達式引擎内部的變量中;
後向引用:\1,\2,\3,...
a|b:a或者b
C|cat:表示C或cat;
(C|c)at:表示Cat或cat;
本文轉自 crystaleone 51CTO部落格,原文連結:http://blog.51cto.com/linsj/1750394,如需轉載請自行聯系原作者