關於grep,egrep以及fgrep,是我們Linux服務器中常用的文本過濾工具。掌握好這三個工具並結合正則表達式,對我們日後的運維工作有很大的幫助。
1.grep,egrep,及fgrep區別。
三者的主要區別在於對正則表達式的支持不同。首先,grep支持的是標准正則表達式;而egrep及grep -e則支持的是擴展正則表達式;至於fgrep,是不支持正則表達式的,在本文也就不再贅述。但是其在速度方面,相對前面兩者,就比較快了,在精確匹配是就很好用。
2.支持的常用選項
選項
作用
--color=auto
設置語法著色(可用alias默認使用)
-v
反向選取
-o
僅顯示匹配到的字符串
-i
不區分大小寫
-E(僅grep支持)
使用擴展正則表達式
-A #
顯示匹配到行及其前的#行
-B #
顯示匹配到行及其後的#行
-C #
顯示匹配到行及其前的#行和其後的#行
3.常用字符合集(注:可在正則表達式的字符匹配中結合[]或[^]使用)
[:digit:] 所有數字
[:lower:] 所有小寫字母
[:upper:] 所有大些字母
[:space:] 空白字符
[:punct:] 標點符號
[:alpha:] 大寫加小寫字母
[:alnum:] 所有字母加數字
4.標准正則表達式的元字符
(注:為了使效果更明顯,已設置別名alias grep="grep --color=auto".所使用示例文件在文章最下方)
字符匹配
.:匹配任意單個字符
[root@localhost ~]# grep "r..t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[]:匹配指定范圍內的任意單個字符
[root@localhost ~]# grep "r[[:alpha:]].t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
如上所示,[:alpha:]表示所有字母的集合,所以外邊再加個[]就是所有小寫字母其中的一個了。
所以在第一次匹配的v/ftp也就因為第二個不是字母而沒有匹配到了.
[^]取反,也就是指定范圍外的任意單個字符
[root@localhost ~]# grep "r[^[:alpha:]].t" /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
如上圖,[:alpha:]表示所有字母的集合,所以外邊再加個[^]就是非所有小寫字母其中的一個。
所以root就匹配不到,而v/ftp就匹配到了.
次數匹配
*:任意其前面的字符任意次
[root@localhost ~]# grep “b*c” test
bc
bbc
abbbc
\?:匹配其前字符零次或一次
[root@localhost ~]# grep "b\?c" test
bc
bbc
abbbc
\{m,n\}:匹配其前面的字符至少m,至多n次
[root@localhost ~]# grep "b\{2,3\}c" test
bbc
abbbc
\{m\}:匹配其前面的字符m次
[root@localhost ~]# grep "b\{2\}c" test
bbc
abbbc
\{0,n\}:表示匹配其前面的字符至多n此
[root@localhost ~]# grep "b\{0,2\}c" test
bc
bbc
abbbc
\{m,\}:表示匹配其前面的字符至少m次
[root@localhost ~]# grep "b\{3,\}c" test
abbbc
位置錨定
^:錨定每行的起始位置
[root@localhost ~]# grep "^bc" test
bc
bbc
$:錨定每行的結束位置
[root@localhost ~]# grep "bc$" test
bc
bbc
abbbc
\<:錨定詞首
[root@localhost ~]# grep "\<cd" test1
ab.cd.ef
\>:錨定詞尾 注:不包含特殊字符組成的串叫單詞
[root@localhost ~]# grep "b\>" test1
ab.cd.ef
\b:等同於\<或\>,在單詞左邊為錨定詞首,反之為錨定詞尾
[root@localhost ~]# grep "\bcd" test1
ab.cd.ef
[root@localhost ~]# grep "b\b" test1
ab.cd.ef
^$:沒有任何字符的空白行
[root@localhost ~]# grep "^$" test1
分組,引用及或
\(\):可以將一串字符串引用起來,並可以結合次數匹配使用,也可以使用\n進行引用
[root@localhost ~]# grep "\(abc\)\{2\}" test2
abcabcabc
[root@localhost ~]# grep "\(a.c\).*\1" test2
#\n 表示引用第n個括號匹配到的內容,而非模式本身,所以
abczzzzzzzzzzza;c就沒有被匹配到
abcabcabc
abczzzzzzzzzzzabc
a;czzzzzzzzzzza;c
\|:或者的意思
[root@localhost ~]# grep "abc\|def" test3
abcef
abdef
abc
def
[root@localhost ~]# grep "ab\(c\|d\)ef" test3
#或表示其前方的字符串或後面的字符串,而非單個字符,欲匹配單個字符,可以結合\(\)使用
abcef
abdef
5.擴展正則表達式
關於擴展正則表達式的元字符大體上和標准正則表達式是一樣的,只是在一些元字符使用時,不再需要使用\進行轉義,只有在使用詞首錨定(\<),詞尾錨定(\>)以及分組的引用(\n)時轉義,可以使模式更加簡潔,可讀性也會更強.同時也可以使用 + 表示匹配其前面的字符至少1次。
-----------------------------------華麗的分割線--------------------------------------
附:
上述示例使用文件內容
[root@localhost ~]# cat test
bc
bbc
abbbc
[root@localhost ~]# cat test1
ab.cd.ef
abcdef
abde.ef
[root@localhost ~]# cat test2
abc
abcabcabc
abczzzzzzzzzzzabc
a;czzzzzzzzzzza;c
abczzzzzzzzzzza;c
[root@localhost ~]# cat test3
abcef
abdef
abc
def
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