1. 程式人生 > >Linux命令- grep +正則表示式

Linux命令- grep +正則表示式

一、簡介:

grep (global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來)是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹配的行打印出來。Unix的grep家族包括grep、egrep和fgrep egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴充套件,支援更多的re元字元, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表示式中的元字元表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令列選項來使用egrep和fgrep的功能。

二、grep常規用法

-c:顯示匹配行的數量

-i:不區分大小寫

-n:在輸出符合要求的行的同時顯示行號

-v:輸出顯示不符合要求的行,即反向選擇

-r:會把目錄下所有的檔案全部遍歷

--color=auto:把匹配到的關鍵詞加上顏色顯示

-A:後跟一個數字n,表示輸出顯示符合要求的行以及下面n行

-B:後跟一個數字n,表示輸出顯示符合要求的行以及上面n行

-C:後跟一個數字n,表示列印符合要求的行以及上下各n行

舉例說明:

1、將/etc/passwd目錄下,出現 root 的行取出來

# grep  root  /etc/passwd

或者  # cat  /etc/passwd | grep  root

2、過濾出帶有“root”關鍵詞的行並輸出行號

grep -n ‘root' 1.txt

3、過濾出不帶有“root”關鍵詞的行並輸出行號

grep -nv ‘root' 1.txt

4、將/etc/passwd,將沒有出現 root 和nologin的行取出來

# grep -v root  /etc/passwd | grep -v nologin

5、用 dmesg 列出核心資訊,再以 grep 找出內含 eth 那行,在關鍵字所在行的前兩行與後三行也一起捉出來顯示

# dmesg | grep -n -A3 -B2  --color=auto  'eth'

另:在關鍵字的顯示方面,grep 可以使用 --color=auto 來將關鍵字部分使用顏色顯示。但是如果每次使用 grep 都得要自行加上 --color=auto 又很麻煩,可以使用 alias來處理。做法:在 ~/.bashrc 內加上這行:

alias  grep='grep --color=auto'

再以source ~/.bashrc 來立即生效即可~這樣每次執行 grep就會自動加上顏色顯示。

6、根據檔案內容遞迴查詢目錄

# grep ‘energywise’ *         #在當前目錄搜尋帶'energywise'行的檔案

# grep  -r ‘energywise’ *     #在當前目錄及其子目錄下搜尋'energywise'行的檔案

# grep –l  -r ‘energywise’ *  #在當前目錄及其子目錄下搜尋'energywise'行的檔案,

但是不顯示匹配的行,只顯示匹配的檔案

三、grep與正則表示式

.    表示除換行符之外的任意一個字元

*    表示重複0個或多個*前面的字元

+    表示重複1個或多個+前面的字元

?    表示0個或1個?前面的字元

.*   表示任意個任意字元(包含空行)

[ ]  用於指定一個字符集,無論[ ]中有多少東西,只能匹配其中的一個字元。

注意:+和?grep不支援,egrep才支援。

1、字符集和單詞

表示除換行符之外的任意一個字元。如 .at 會匹配出諸如cat、hat、bat等字串。

當我們在一組集合位元組中,如果該位元組組是連續的,例如大寫英文/小寫英文/數字等,可以使用[a-z],[A-Z],[0-9]等方式來書寫,那麼如果我們的要求字串是數字與英文,就將他全部寫在一起,變成:[a-zA-Z0-9]。[[a-zA-Z]代表所有的英文字母。

例如:

egrep ‘[a-z]at’ /usr/words

結果如:Akhmatova     Alcatraz‘s      Allstate……

如果只希望匹配一個單詞,需要為它加上一對分隔符“\<”和“\>”

\<[a-z]at\>  

結果如:bat  bat‘s  cat  eat……

過濾兩個或多個關鍵詞

grep -E ‘123|abc‘ filename   #找出檔案中包含123或者abc的行

或者egrep ‘123|abc‘ filename

或者awk ‘/123|abc/‘ filename

egrep=grep -E

2、位置匹配

“^”匹配行首字元,“$” 匹配行尾字元。

例如:

過濾出以“the”開頭的行,並顯示行號

grep -n  '^the'  regular_express.txt

過濾掉/去除所有以#開頭的行

grep  -v ‘^#‘ 1.txt

過濾掉/去除所有空行和以#開頭的行

grep  -v ‘^$‘ 1.txt | grep -v ‘^#‘

過濾出以所有英文字母開頭的行

grep ‘^[a-zA-Z]‘ 1.txt

過濾出以非數字開頭的行

grep -v ‘^[0-9]‘ 1.txt  或者 grep ‘^[^0-9]‘ 1.txt

過濾出行尾結束為小數 (.) 的那一行

grep -n  '\.$'  regular_express.txt

3、重複

元字元

描述

*

重複0次或多次

+

重複一次或多次

重複0次或多次

{n}

重複n次

{n,}

重複n次或多次

{n,m}

重複不少於n次,不多於m次

例如:

匹配1個或者1個以上+前面的字元

egrep ‘o+‘ 1.txt

匹配0個或者1個?前面的字元

egrep ‘ao?‘ 1.txt

匹配roo或者匹配body

egrep ‘roo|body‘ 1.txt

用括號表示一個整體,匹配1個或者多個oo

egrep ‘(oo)+‘ 1.txt

過濾出“至少兩個 o 以上的字串”時,就需要 ooo* ,即:

grep –n  'ooo*' regular_express.txt

如想要找出 g 開頭與 g 結尾的行,當中的字元可有可無

grep -n  'g.*g' regular_express.txt

過濾出 g 後面接 2 5 o ,然後再接一個 g 的字串

grep  -n  'go\{2,5\}g'  regular_express.txt

注:筆者現在不想研究這個為什麼grep後面的{},就加\轉義,egrep就都沒加,

目前搜到加轉義是因為{}在shell中有特殊含義,而筆者也不知道什麼事shell。

算了,以後有時間研究了再更新部落格吧~

擴充套件grep(grep -E 或者 egrep)

使用擴充套件grep的主要好處是增加了額外的正則表示式元字符集。

過濾顯示所有包含NWEA的行。如果不是使用egrep,而是grep,將不會有結果查出。

# egrep  'NW|EA'  testfile

對於標準grep,如果在擴充套件元字元前面加\grep會自動啟用擴充套件選項-E

#grep  'NW\|EA'  testfile

4、反義

是指除了某個字元外,其他什麼都可以。例如,表示除了字母y的任何字元的正則表示式是:[^y]

注:匹配所有不以字母y開頭的行: ^[^y]

5、字元轉義

一些字元具有一些特殊含義,如“.”在正則表示式中表示“除了換行符之外的任意一個字元”,那想要表示“.”本身就需要用到轉義字元“\”,它可以取消所有元字元的特殊含義。例如:“\.”匹配句點“.”,如果要匹配“\”,就用“\\”表示。

例如:下面的正則表示式匹配的是“www.baidu.com”:  www\.baidu\.com  

6、分支和子表示式(子表示式即分組)

分支:如:^ht$    正則表示會執行“與”組合,表示所有以字母h開頭,t結尾的行。

如果表示“或”組合的關係則使用“|”分隔。如匹配以字母h開頭,或者t結尾的行:

^h|t$

子表示式:

如上例:用括號表示一個整體,匹配1個或者多個oo: egrep ‘(oo)+‘ 1.txt

又如:egrep “(or){2,}” /usr/words 匹配的是所有or重複2次或更多次的行。

如果:egrep “or{2,}” /usr/words  匹配的是字母o後面跟兩個或更多字母r的行。


<!--以上內容,部分來自網路,若侵刪。經筆者整合彙總完成,如需轉載,請註明出處。-->