linux上強(qiáng)大的字符串匹配工具詳解-grep

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市髓绽,隨后出現(xiàn)的幾起案子敛苇,更是在濱河造成了極大的恐慌,老刑警劉巖顺呕,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枫攀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡株茶,警方通過查閱死者的電腦和手機(jī)来涨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來启盛,“玉大人蹦掐,你說我怎么就攤上這事〗┐常” “怎么了卧抗?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鳖粟。 經(jīng)常有香客問我社裆,道長(zhǎng),這世上最難降的妖魔是什么向图? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任泳秀,我火速辦了婚禮标沪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗜傅。我一直安慰自己金句,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布磺陡。 她就那樣靜靜地躺著趴梢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪币他。 梳的紋絲不亂的頭發(fā)上坞靶,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蝴悉,去河邊找鬼彰阴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拍冠,可吹牛的內(nèi)容都是我干的尿这。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庆杜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼射众!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晃财,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤叨橱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后断盛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罗洗,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年钢猛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伙菜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡命迈,死狀恐怖贩绕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躺翻,我是刑警寧澤丧叽,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站公你,受9級(jí)特大地震影響踊淳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一迂尝、第九天 我趴在偏房一處隱蔽的房頂上張望脱茉。 院中可真熱鬧,春花似錦垄开、人聲如沸琴许。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榜田。三九已至,卻和暖如春锻梳,著一層夾襖步出監(jiān)牢的瞬間箭券,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工疑枯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辩块,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓荆永,卻偏偏與公主長(zhǎng)得像废亭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子具钥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355