1. grep 是什么
grep 是用于匹配輸入數(shù)據(jù)中符合條件的字符串的工具康震,其匹配過程支持正則表達(dá)式,因而匹配能力非常強(qiáng)大灾螃。
grep 可以從文件或者標(biāo)準(zhǔn)輸入設(shè)備中讀取數(shù)據(jù)剑逃,若不指定任何文件名稱,或是所給予的文件名為 -
扔枫,則 grep 會(huì)從標(biāo)準(zhǔn)輸入設(shè)備讀取數(shù)據(jù),否則從文件讀取數(shù)據(jù)進(jìn)行匹配锹安。
2. 怎么用
grep 的命令格式如下:
grep [option] pattern file [file2…]
3. 能匹配什么
我們先來看看 grep 能匹配什么短荐,也就是 pattern
參數(shù)支持哪些形式。
3.1 普通全匹配
這也是最普通的字符串匹配了八毯,直接匹配 pattern
所指的字符串搓侄。例如,
grep apple file.txt
#匹配結(jié)果如下话速,會(huì)直接列出匹配的行
apple
apple
3.2 正則表達(dá)式匹配
我們上面也說到了,grep強(qiáng)大的匹配能力就在于其支持正則表達(dá)式芯侥,下面我們來看看 grep 支持的正則表達(dá)式語法有哪些泊交。
首先,grep 默認(rèn)支持的是以下正則表達(dá)式柱查。
位置限定匹配
- 匹配行開頭:^
grep ^a file.txt
匹配a開頭的行廓俭,注意是要該行的開頭是a才會(huì)匹配。如果不是在開頭出現(xiàn)唉工,即使中間出現(xiàn)了也不會(huì)匹配該行研乒。
- 匹配行結(jié)尾:$
grep a$ file.txt
匹配a結(jié)尾的行,注意是要該行的結(jié)尾是a才會(huì)匹配淋硝。
- 匹配單詞開頭:\<
grep '\<app' #匹配app開頭的單詞所在的行雹熬,例如apple,注意要有引號(hào)
- 匹配單詞結(jié)尾:\>
grep 'le\>' #匹配le結(jié)尾的單詞所在的行谣膳,例如apple竿报,注意要有引號(hào)
- 單詞鎖定匹配:\b
grep '\bgrep\b' #只匹配單詞grep,例如不會(huì)匹配到grepa
字符匹配
. grep .a file.txt #匹配任意一個(gè)字符 例如 aa,ba等
[] grep "[abc]c" file.txt #匹配[]里的任意一個(gè)字符继谚,例如ac或者bc或者cc烈菌,注意加引號(hào)
grep "[a-z]a" file.txt #匹配a-z間的26個(gè)字母任意一個(gè)字符,例如aa
[^] grep "[^ab]a" #匹配除ab之外的任意一個(gè)字符花履,例如da
\w grep "\w" file.txt #匹配文字和數(shù)字字符芽世,也就是[A-Za-z0-9]
\W grep "\W" file.txt #\w的反置形式,匹配一個(gè)或多個(gè)非單詞字符诡壁,如點(diǎn)號(hào)句號(hào)等
次數(shù)限定匹配
* grep "a*b" file.text # *前面的字符重復(fù)0到多次济瓢,例如b,ab,aab
\{m\} grep "x\{m\}" file.text #重復(fù)字符x,m次欢峰,如:grep '0\{3\}'匹配包含3個(gè)0的行
\{m,\} grep "x\{m,\}" file.text #重復(fù)字符x,至少m次葬荷,如:'0\{5,\}'匹配至少有5個(gè)0的行
\{m,n\} grep "x\{m,n\}" #重復(fù)字符x涨共,至少m次,不多于n次宠漩,如:'0\{5,10\}'匹配5--10個(gè)0的行
拓展匹配模式
除了上面默認(rèn)支持的模式之外举反,grep 還支持拓展匹配模式,拓展匹配模式要加參數(shù) -E
扒吁,支持的拓展匹配模式如下:
? grep -E 'go?d' file.txt #?匹配0個(gè)或1個(gè)在其之前的字符火鼻,例如這里匹配gd,god
+ grep -E 'go+d' file.txt #?匹配1個(gè)或多個(gè)在其之前的字符雕崩,例如這里匹配god魁索,good等
() grep -E 'g(oo)d' file.text #匹配括號(hào)里的字符串,一般都是和其他匹配模式一起使用盼铁,例如 grep -E 'g(oo)?d' file.text
| grep -E 'god|good' file.txt #匹配被|分隔的多個(gè)字符串粗蔚,例如此例匹配god或者good
注意點(diǎn)
- 對(duì)于標(biāo)準(zhǔn)grep,如果在擴(kuò)展元字符前面加\饶火,grep會(huì)自動(dòng)啟用擴(kuò)展選項(xiàng)-E鹏控。例如,
grep 'go\?d' file.txt
- 當(dāng)我們想要把上面的匹配模式所用到的字符當(dāng)做普通字符來匹配,需要用到轉(zhuǎn)義字符"\"肤寝,不過如果這些特殊字符是位于"[]"當(dāng)做的時(shí)候当辐,大部分都會(huì)自動(dòng)轉(zhuǎn)義為普通字符了,除了"-"或者"^"等極少數(shù)字符以外鲤看。
4. option參數(shù)
了解了 grep 能匹配哪些數(shù)據(jù)之后缘揪,我們?cè)賮砹私庀?grep 可用的參數(shù),grep 的參數(shù)主要用來影響查找的過程以及打印結(jié)果的义桂。
4.1 影響查找過程
-a 將二進(jìn)制文檔以文本的方式來查找
-d <動(dòng)作> 當(dāng)指定要查找的含有目錄(例如 grep apple ./*)找筝,必須使用這項(xiàng)參數(shù),否則grep指令將回報(bào)信息并停止動(dòng)作澡刹。其中動(dòng)作支持呻征,skip:跳過目錄,recurse:遞歸讀取目錄的數(shù)據(jù)
-E 開啟對(duì)拓展匹配模式的支持罢浇,如上面的例子
-f 指定匹配模式規(guī)則文件陆赋,其內(nèi)容含有一個(gè)或多個(gè)匹配模式規(guī)則,格式為每行一個(gè)匹配模式規(guī)則嚷闭。
-F 等同于fgrep命令攒岛,也就是fast grep,會(huì)把所有的字符都看作普通字符胞锰,也就是說正則表達(dá)式中的所有字符表示回其自身的字面意義灾锯,不再特殊。
-i 忽略字符大小寫的差別
-r/-R 此參數(shù)的效果和指定"-d recurse"參數(shù)相同嗅榕。
-w 單詞匹配顺饮,等同于 "\<word\>"或者"\bword\b"
-y 忽略關(guān)鍵字符的大小寫吵聪。(跟-i參數(shù)相同)
4.2 影響打印結(jié)果
-A <num> 除了顯示符合模式的那一列之外,再顯示該行之后num行的內(nèi)容
-B <num> 除了顯示符合模式的那一列之外兼雄,再顯示該行之前num行的內(nèi)容
-b 在匹配到行的開頭標(biāo)示該行的第一個(gè)字符前面總共多少byte數(shù)據(jù)
-color 以特定顏色高亮顯示匹配關(guān)鍵字
-c 僅顯示匹配行的總行數(shù)
-C <num> 除了匹配的那一行之外吟逝,并顯示該行之前后各num行的內(nèi)容,其中C是可以省略的赦肋,可以直接 grep -4 apple file.txt
-h 在顯示匹配的那一行之前块攒,不顯示該行所屬的文件名稱(不加這個(gè)參數(shù),匹配多個(gè)文件的時(shí)候會(huì)顯示命中文件的名字)
-H 在顯示匹配的那一行之前佃乘,表示該行所屬的文件名稱(不加這個(gè)參數(shù)囱井,匹配單個(gè)文件的時(shí)候不會(huì)顯示命中文件的名字)
-l 只顯示命中的文件的名稱
-L 只顯示沒命中的文件的名稱
-n 顯示命中的行所在的行數(shù)
-o 只顯示匹配的部分,不顯示該行其他的部分
-P 使用perl的正則表達(dá)式語法趣避,因?yàn)閜erl的正則更加多元化庞呕,能實(shí)現(xiàn)更加復(fù)雜的場(chǎng)景。典型用法是匹配指定字符串之間的字符程帕。(-e或-E是匹配擴(kuò)展正則表達(dá)式千扶,-P是匹配perl正則表達(dá)式)
-q 不顯示任何信息
-s 不顯示錯(cuò)誤信息
-v 顯示不包含匹配文本的所有行
-V 顯示版本信息
-x 只顯示整行都符合的列。
參考資料
https://zh.wikipedia.org/wiki/Grep#egrep%E5%92%8Cfgrep
https://www.runoob.com/linux/linux-comm-grep.html
https://www.cnblogs.com/kevingrace/p/9299232.html
Enjoy it !
如果覺得文章對(duì)你有用骆捧,可以贊助我喝杯咖啡~
版權(quán)聲明
轉(zhuǎn)載請(qǐng)注明作者和文章出處
作者: X先生
http://www.reibang.com/p/218fb5d3934b