本文轉載自:如何使用Unix/Linux grep命令——磨刀不誤砍柴工系列。該博文條理很清晰。正則表達式
grep在一個或多個文件中查找與模式字符串(pattern)匹配的行,並將搜索的結果打印出來,不會修改原文件內容。使用grep 命令的語法爲:shell
$grep [option(s)] pattern [file(s)]
其中option爲grep命令的選項,pattern爲要匹配的簡單字符串或攜帶特殊字符的模式字符串,file爲文件列表,可有多個文件。express
-i 忽略pattern中的大小寫apache
$grep -i hAL /etc/passwd
-w 搜索整個詞彙
忽略大小寫並搜索整個詞彙"samba"ide
$grep -iw "samba" /tec/samba/smb.conf # This is the main Samba configuration file. You should read the # here. Samba has a huge number of configurable options (perhaps too # For a step to step guide on installing, configuring and using samba, # read the Samba-HOWTO-Collection. This may be obtained from:
-r 遞歸地指定文件所在目錄中的全部子目錄中的文件
-v 查找與pattern不匹配的行ui
定義輸出方式:
-o 僅打印出匹配的一段,而非整行
-n 打印出匹配行的行號
-l 僅打印出匹配行所在的文件
-c 打印出每一個文件中匹配行的總數
-A num 顯示匹配行以後的num行
-B num 顯示匹配行以前的num行
-C num 至關於 -A num 與 -B num 的組合
--color=auto 將pattern在匹配行中高亮輸出spa
注意:
1)選項區分大小寫
2)多個選項能夠一塊兒使用,例如:.net
$grep -iwr
3)grep可用於shell腳本,由於grep經過返回一個狀態值來講明搜索的狀態,若是模板搜索成功,則返回0,若是搜索不成功,則返回1,若是搜索的文件不存在,則返回2。咱們利用這些返回值就可進行一些自動化的文本處理工做。日誌
儘管直接使用最簡單直接的pattern字串能夠完成一些重要任務,可是grep命令的真正威力在於它可使用正則表達式來完成複雜的模式字串的匹配。grep命令中使用的是「基本的正則表達式」,若是想使用更高級的正則表達式規則,須要指定選項 -E ,至關於egrep命令。
如下字符或字符串在正則表達式的規則中具備特殊意義,如,*,+,[,],^,$,\,{,}
它們的多種組合展現了基本的正則表達式的匹配模式:
1)'.'匹配任意單一字符
2)X* 與包含連續0個或多個字符X的行匹配
3)X\+ 與包含連續1個或多個字符X的行匹配
4)[a-z] 與包含a-z的其中一個字符的行匹配
5)[^a-z] 與不包含a-z的其中一個字符的行匹配
6)[0-9] 與包含0-9的其中一個字符的行匹配
7)^hello 與以字串hello起始的行匹配
8)hello$ 與以字串hello結束的行匹配
9)\ 轉義字符,後跟特殊字符,可表示它原本的涵義
10)
\d 匹配一個數字字符,等價於 [0-9]
\D 匹配一個非數字符,等價於 [^0-9]
\w 等價於 "[A-Za-z0-9_]"
\W 匹配任何非單詞字符,等價於 "[^A-Za-z0-9]"
\s 匹配任何空白字符,包括空格、製表符、換頁符等等,等價於[\f\n\r\t\v]
\S 匹配任何非空白字符,等價於 [^\f\r\n\t\v]
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。
\B 匹配非單詞邊界。
如,code
$grep '[' filename
返回結果爲grep : Invalid regular expression
而,
$grep '\[' filename
會匹配全部包含‘['(不包括單引號)的行。
11)
X\{n\} 與連續包含n個字符X的行匹配
X\ {n,\} 與至少連續包含n個字符X的行匹配 (注意n後面的',')
X\{,m\} 與最多連續包含m個字符X的行匹配 (注意m前面的',')
X\{n,m\} 與最少包含n個,最多包含m個字符X的行匹配
注意:
不要混淆shell 中的"."、"*"與正則表達式中的"."、"*",不少剛開始學的人都會犯錯。
在正則表達式中,"."很像shell中的"?",它與任意單一字符匹配。而"*"在正則表達式中的使用,表示"*"前面的字符可能出現0次或1次或屢次,與shell中的"*"涵義不一樣。
1)grep OR 操做(4 種方法)
A. 使用 \|
$grep 'pattern1\|pattern2' filename
B. 使用 -E 選項
grep -E 表明擴展的正則表達式. 若使用-E選項,則能夠去掉轉義字符'\',直接使用'|'
$grep -E 'pattern1|pattern2' filename
C. 使用 egrep 命令
egrep 至關於 ‘grep -E’.
D. 使用 -e 選項
經過指定多個-e選項來應用多個pattern,多個pattern之間是「或」的關係
$grep -e pattern1 -e pattern2 filename
2)grep AND 操做
A. 使用 -E選項和模式字符 'pattern1.*pattern2'
$grep -E 'pattern1.*pattern2' filename
以上命令爲在filename文件中查找既與pattern1匹配又與pattern2匹配的行
$grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
B. 利用管道實現
$grep -E 'pattern1' filename | grep -E 'pattern2'
3)grep NOT 操做
A. 使用 -v 選項
$grep -v 'pattern' filename
以上命令在filename文件中查找不能與pattern匹配的行
1)對文件中的空行計數
$grep -c "^$" filename
2)查找在「hello」有任意長度字串的行
$grep ".*hello" filename
3)查找在'hi'與'hello'之間至少有一個空格的行
$grep "hi \+hello" filename
4)查找在'hi'與'hello'之間沒有空格或有多個空格的行
$grep "hi *hello" filename
5)查找在'hi'與'hello'之間沒有空格或有1個空格的行
$grep "hi \?hello" filename
6)查找ip地址127.0.0.1 (其中包含特殊字符 '.')
$grep "127\.0\.0\.1" filename
7)過濾其餘命令的輸出結果
$ls --help | grep "dired"
將ls命令的幫助文本,做爲grep的輸入,查找與"dired"匹配的行
輸出爲:-D, --dired generate output designed for Emacs' dired mode
8)從系統日誌中得到有用的信息
在apache日誌文件中查找以IP地址開頭,包含數字200的行
$grep -Eoc "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.* 200" /srv/www/example.com/logs/access.log