linux在進行文本處理過程中的文本搜索工具稱爲正則表達式。文本搜索工具有grep、egrep、fgrep,egrep爲正則表達式的擴展正則表達式,fgrep用於搜索文本字符串,與 grep 和 egrep 命令不同,因爲它搜索字符串而不是搜索匹配表達式的模式。grep的含義爲: global search Regular expression and Print out the line。
正則表達式(REGular EXPression REGEXP)是由元字符及正常字符所書寫的模式,其中的元字符不表示字符本身的意義,而是用於表達控制或通配功能,根據用戶指定的文本模式(正則表達元字符以及正常字符組合而成)對目標文件進行逐行搜索,顯示能匹配到的行。
首先講述的是正則表達式grep指令的用法以及一些常用的選項的應用以及簡單的示例:
grep [OPTIONS] PATTERN [FILE...]
--color=auto 自動顯示 }
always 有時 } 對匹配到內容是否自動顯示爲紅色
never 從不顯示 }
-o:只顯示被匹配到的內容
-i:ignore case ,所有的不區分字符大小寫
-v: 顯示不能夠被模式匹配到的行
-E :使用擴展的正則表達式
-A # : 被模式所匹配的行以及後面#行
-B#:被模式所匹配的行以及前面#行
-C#:被模式所匹配的行以及前後#行
示例1:顯示匹配到的字符紅色
[root@localhost ~]# grep --color=auto "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
示例2:只顯示匹配到的內容
[root@localhost ~]# grep -o --color=auto "root" /etc/passwd
root
root
root
root
下面講的是基本正則表達式的元字符:
字符匹配:
. :匹配單個字符
[]:匹配指定範圍內的任意單個字符
例: [root@localhost ~]# grep "[Cc]a" /etc/rc.d/rc.sysinit
匹配出現Ca或ca,a不作爲結尾,C/c不作爲開頭,匹配Ca或者ca在文本中每行的任意位置。
[^] :匹配指定範圍外的任意單個字符
[0-9]、[[:digit:]]表示0-9中的任意的單個數字
[^0-9]、[^[:digit:]]表示0-9範圍外的任意單個字符
[a-z]、[[:lower:]]表示a-z中任意一個小寫字母
[A-Z]、[[:upper:]]表示A-Z中任意一個大寫字母
[[:space:]]表示一個空格符
[[:punct:]]表示任意一個標點符號
[0-9a-zA-Z]、[[:alnum:]]表示任意一個數字或字母
[a-zA-Z]、[[:alpha:]]表示任意一個大寫字母或小寫字母
次數匹配:在期望匹配字符後面提供一個控制符,用於表達匹配前面字符指定的次數。
* :任意次數
例:"ab*c" ab……bc匹配任意個b abbc ,ac 可以匹配到 abb, 不能匹配到 .* : 任意長度的任意字符 (貪婪模式,會僅可能的去匹配)
例
[root@localhost ~]# grep "r.*t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
\? :0次或1次 ,表示其左側字符可有可無 " ab \?c " abc ,ac 可以 abbc 不可以
\+ : 1次或多次,表示其左側字符至少出現1次;
" ab \+c " ac ,不可以 abc,abbbbc 可以
\{m\} :m次,表示其左側字符精確出現m次; \{m,n\}:表示其左側字符至少出現m次,至多出現n次; "ab\{2\}c" 匹配2次 -> abbc
\{0,n\} : 至多n次 "ab\{0,3\}c" 0~3次 -> ab、 abbc 、abbbc \{m,\} : 至少m次
"ab\{1,\}c" -> ab、 abbc 、abbbc 、 ab…bc
位置錨定:
^ :錨定行首,^ PATTERN
$:錨定行尾,PATTERN$
^PATTERN$ :用模式來匹配整行內容
^$ :匹配空白行;
例:用於匹配整行內容
[root@localhost ~]# grep "^sh.*sh$" /etc/passwd
sharang:x:5002:5002::home/sharang:/bin/tcsh
單詞錨定: 由非特殊字符組成的連續的字符串
錨定單詞詞首: \< PATTERN或\b [root@localhost tmp]# grep "\<sh" /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
錨定詞尾: PATTERN\>或PATTERN \b
\<PATTERN\>:匹配到PATTERN能匹配到整個單詞
例:匹配兩位數字
[root@localhost ~]# ifconfig | grep "\<[0-9]\{2\}\>"
eth0 Link encap:Ethernet HWaddr 00:0C:29:5A:B6:F5
inet addr:192.168.191.16 Bcast:192.168.191.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe5a:b6f5/64 Scope:Link
分組:\(\)
注意:分組中的模式,在某次的具體匹配過程中所匹配到的字符可以被grep記憶 (保存於內置的變量 中,這些變量是 \1 , \2 ,…) 因此,還可以被引用
\1 : 引用,模式自左而右,由第一次左括號以及與之對應的右括號中的模式所匹配到的內容
\2 :引用 ,模式中自左而右,由第二個左括號以及與之對應的右括號中的模式所匹配到的內容;
\(ab\(cd\)\) \1 \2 \1匹配到ab \2匹配到cd
(1) He like his lover. (2) He like his liker. (3) She love her lover. (4) She love her liker.
"\(l..e\).*\1" 可以匹配上面內容
下面說下擴展的正則表達式egrep,也是通過搜索匹配表達式的模式,不過於grep的區別就是不需要添加轉義符\ ,字符匹配、次數匹配、位置錨定、分組的用法是相同的。
字符匹配: .:匹配單個字符
[]:匹配任意單個字符
[^]:匹配範圍外的任意單個字符
次數匹配:
*:任意次
?:0次或1次
+ :至少1次
{m}:精確匹配m次
{m,n}: 至少m次,至多n次
{m,}:至少m次
{0,n}:至多n次
位置錨定:
^: 錨定行首
$ : 錨定行尾
\<、\b:錨定詞首
\>、\:錨定詞尾
分組:
(): 引用爲: \1,\2...
或者:
a|b :a或b,或者兩側的所有內容;
例:匹配meminfo中S或s開頭的行
# egrep "^(S|s)" /proc/meminfo
最後的fgrep命令是用來查找一個或多個與給出的字符串或詞組相匹配文件中的行。fgrep 查詢速度比grep命令快,但是不夠靈活:它只能找固定的文本,而不是規則表達式。