[TOC]
介紹
grep (global search regular expression(RE) and print out the line,全面搜索正則表達(dá)式并把行打印出來)是一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式搜索文本阅爽,并把匹配的行打印出來
- egrep和fgrep的命令只跟grep有很小不同
- egrep是grep的擴(kuò)展刺覆,支持更多的re元字符
- fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞壳贪,也就是說氢妈,正則表達(dá)式中的元字符表示回其自身的字面意義眼坏,不再特殊
MacOS使用Free-BSD版本的grep菇肃,區(qū)別是很UNIX很死板
linux使用GNU版本的grep
它功能更強(qiáng),可以通過-G取募、-E琐谤、-F命令行選項(xiàng)來使用egrep和fgrep的功能
標(biāo)準(zhǔn)命令
grep [-acinv] [--color=auto] '[搜尋字符串]' filename
選項(xiàng)與參數(shù):
-V : 輸出grep指令的當(dāng)前版本
-a : 將 binary 文件以 text 文件的方式搜尋數(shù)據(jù)
-c : 計(jì)算找到 '搜尋字符串' 的次數(shù)
-i : 忽略大小寫的不同,所以大小寫視為相同
-n : 輸出行號(hào)
-v : 反向選擇玩敏,亦即顯示出沒有 '搜尋字符串' 內(nèi)容的那一行
--color=auto : 可以將找到的關(guān)鍵詞部分加上顏色的顯示
-An : 之后n行 after
-Bn : 之前n行 before
-Num : 例如 -5 就是前后5行
-I : 忽略二進(jìn)制文件
-r -R : 遞歸查找
-L : 只輸出匹配到的文件
-G : 基礎(chǔ)正則匹配
-E : 擴(kuò)展正則匹配 等效 egrep
-F : 匹配多字符串模式只能找固定的文本 等效 fgrep
搜索關(guān)鍵字
# 將/etc/passwd 中含有 root 的行都顯示出來
grep root /etc/passwd
# 將/etc/passwd斗忌,有出現(xiàn) root 的行取出來,同時(shí)顯示這些行在/etc/passwd的行號(hào)
grep -n root /etc/passwd
# 將/etc/passwd质礼,將沒有出現(xiàn) root 的行取出來
grep -v root /etc/passwd
# 將/etc/passwd,將沒有出現(xiàn) root 和nologin的行取出來
grep -v root /etc/passwd | grep -v nologin
# 用 dmesg 列出核心信息织阳,再以 grep 找出內(nèi)含 eth 那行,要將捉到的關(guān)鍵字顯色眶蕉,且加上行號(hào)來表示
sudo dmesg | grep -n --color=auto 'eth'
# dmesg 列出核心信息,篩選出帶有 `eth`的信息唧躲,列出 前2行(B before)造挽,后3行(A after)數(shù)據(jù)
sudo dmesg | grep -n 'eth' -A3 -B2
# dmesg 列出核心信息,篩選出帶有 `eth`的信息弄痹,列出 前后5行數(shù)據(jù)
sudo dmesg | grep -5 'eth'
根據(jù)文件內(nèi)容遞歸查找目錄
# 當(dāng)前目錄中搜索帶有 "echo" 的文件
grep "echo" *
# 遞歸當(dāng)前目錄及其子目錄下搜索帶有 "echo" 行的文件
grep -r "echo" *
# 遞歸當(dāng)前目錄及其子目錄下搜索帶有 "echo" 行的文件, 但是不顯示匹配的行饭入,只顯示匹配的文件
grep -r -L "echo" *
# 遞歸文件夾 "my/log" 打印含有 "echo" 的文件行路徑,行號(hào) 和內(nèi)容
grep -rIn "my/log" "echo"
# 遞歸某一類*.log 文件中含有 "echo"行的肛真,并且打印行號(hào)
find . -name "*.log" -exec grep -n "echo" {} \;
# 也可以使用xargs
find . -name "*.log" | xargs grep --color=auto -In "echo"
grep 正規(guī)表達(dá)式用法
grep 支持的就是 perl 風(fēng)格的正則谐丢, 出現(xiàn)正則不識(shí)別的問題使用 egrep
[]
通配單一字節(jié),無論[]中有多少內(nèi)容蚓让,都是當(dāng)一個(gè)占位來看待
^
反向選則乾忱,也就是非這個(gè)字符串 比如一定不能有小寫字符 [^a-z]
^$
行首 行尾符 只在非() 中生效 可以用于定位字符出現(xiàn)的位置
.
表示任意字節(jié),也就是通配符
*
表示復(fù)數(shù)字節(jié)历极,比如文件名稱全通配就是 *.*
任意后綴通配 .*
如果該字節(jié)組是連續(xù)的窄瘟,例如大寫英文/小寫英文/數(shù)字等等, 就可以使用[a-z],[A-Z],[0-9]等方式來書寫
限定字符的范圍
- 可以使用
[a-z],[A-Z],[0-9]
等方式來書寫 - 那么如果我們的要求字串是數(shù)字與英文就將他全部寫在一起执解,變成:
[a-zA-Z0-9]
- 不想要開頭是英文字母
^[^a-zA-Z]
- 開頭是小寫字節(jié)
^[a-z]
- 行尾結(jié)束為小數(shù)點(diǎn) 或者某種后綴
\.$
(\.so)$
任意一個(gè)字節(jié) .
與重復(fù)字節(jié) *
. (小數(shù)點(diǎn)):代表『一定有一個(gè)任意字節(jié)』的意思
* (星號(hào)):代表『重復(fù)前一個(gè)字符寞肖, 0 到無窮多次』的意思,為組合形態(tài)
- 類似 good gred 之類的字符串
g..d
- 兩個(gè) o 以上的字串
ooo*
- g 開頭與 g 結(jié)尾的行衰腌,當(dāng)中的字符可有可無
g.*d
限定連續(xù) RE 字符范圍 {}
這個(gè)限定范圍必須和 .
*
配合使用, 且因?yàn)樵趕hell中新蟆,{}
必須被轉(zhuǎn)意才可以使用
- 找到兩個(gè) o 的字串
o\{2\}
- g 后面接 2 到 5 個(gè) o ,然后再接一個(gè) d 的字串
go\{2,5\}d
- 2 個(gè) o 以上的 goooo....d
go\{2,\}d
egrep
使用擴(kuò)展grep的主要好處是增加了額外的正則表達(dá)式元字符集右蕊,這在匹配中文時(shí)常用
比如打印所有包含info或error的行 'info|error'
grep就不會(huì)打印
如果在擴(kuò)展元字符前面加\琼稻,grep會(huì)自動(dòng)啟用擴(kuò)展選項(xiàng)-E,比如上面的匹配饶囚,這樣就合適了
'info\|error'
- 搜索所有包含0個(gè)或1個(gè)小數(shù)點(diǎn)字符的行
egrep '2\.?[0-9]
- 找到一個(gè)或者多個(gè)連續(xù)的error的行
egrep '(error)+'
fgrep
查詢速度比grep命令快帕翻,它只能找固定的文本,而不是規(guī)則表達(dá)式
# 輸出在~/logs/my.log中包含error的行
fgrep 'error' ~/logs/my.log
擴(kuò)展
UNIX Linux 平臺(tái)處理文本的三大件 grep
sed
awk
建議熟練使用他們
查詢幫助文檔
man sed