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的主要好處是增加了額外的正則表示式元字符集。
過濾顯示所有包含NW或EA的行。如果不是使用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的行。
<!--以上內容,部分來自網路,若侵刪。經筆者整合彙總完成,如需轉載,請註明出處。-->