歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 文本過濾之grep,egreo及fgrep 以及正則表達式

文本過濾之grep,egreo及fgrep 以及正則表達式

日期:2017/3/1 9:40:56   编辑:Linux編程

關於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

Copyright © Linux教程網 All Rights Reserved