grep 命令與正則表達(dá)的協(xié)同使用

UpDate 2018-10-22

Author unnam3d

Mail indv.zhang@foxmail.com

Tip Please feel free to contact me via mail above for any confusion or suggestions

grep, egrep, fgrep - print lines matching a pattern

grep(Global Research)亦即根據(jù)某一個模式(過濾規(guī)則)去全局性的搜索文本,并將符合模式的文本行顯示出來蜂林。grep其本身的意義是做部分匹配产艾,也就是說廊遍,當(dāng)你使用grep進(jìn)行搜索的時候璃谨,只要某一行的內(nèi)容里部分匹配蚀瘸,grep就會將結(jié)果顯示出來芽狗。而這里的模式(Pattern)是指绢掰,文本字符和正則表達(dá)式的元字符組合而成的匹配條件。簡而言之,grep就是使用基本正則表達(dá)式定義的模式來過濾文本的命令滴劲。

notice:grep 默認(rèn)工作在貪婪模式下攻晒,也就是在匹配的過程中,會盡可能長的匹配班挖,能匹配到哪就匹配到哪鲁捏。

usage: grep [options] PATTERN [FILE...]

  • option

    -i, --ignore-case:忽略模式和輸入文件中的大小寫

    --colour, --color:將匹配到的內(nèi)容彩色輸出

    -v:反向查找,顯示沒有被模式匹配到的行

    -o:只顯示被模式匹配到的字符串萧芙,每個字符串顯示為一行

    -E:使用擴(kuò)展正則表達(dá)式

    -A #:這其中的#表示一個數(shù)字碴萧,當(dāng)使用grep匹配到字符串后,不僅顯示匹配到的行末购,還顯示該行后面#個行的內(nèi)容破喻,可以理解為after

    -B #:同-A意義相同,不同的是盟榴,顯示的是匹配到的行前面#個行的內(nèi)容曹质,可以理解為before

    -C #:顯示的是匹配到的行前后#個行的內(nèi)容,可以理解為context

## option的例子
## *first* 表示 first是有顏色的
## grep -E = egrep 這里不做舉例
## fgrep可以快速搜索擎场,但不支持正則表達(dá)式氛雪,模式中的字符會被當(dāng)做字符本身去匹配。

$ cat >> test.txt << EOF
> This is the first line
> This is the second line
> This is the third line
> EOF
$ grep -iv 'First' test.txt
This is the second line
This is the third line
$ grep --color 'first' test.txt
This is the *first* line
$ grep -io 'First' test.txt
first
$ grep -A1 'second' test.txt
This is the second line
This is the third line
$ grep -B1 'second' test.txt
This is the first line
This is the second line
$ grep -C1 'second' test.txt
This is the first line
This is the second line
This is the third line

正則表達(dá)式(REGgular EXPression, REGEXP)

正則表達(dá)式分為基本正則表達(dá)式(Basic REGEXP)擴(kuò)展正則表達(dá)式(Extended REGEXP)讥裤。

無論是哪一種趾唱,正則表達(dá)式都含義幾個特性:

  • 元字符
  • 位置錨定
  • 分組

元字符

正則表達(dá)式里都有一些元字符,這些元字符不表示其本身的意義站欺,而是在正則表達(dá)式中有其特定的意義姨夹。我在bash特性簡單梳理一文中提及過文件名通配(globbing)。

在文件名通配中矾策,這些元字符的特定意義如下:

  1. '*' : 匹配任意長度的任意字符
  2. '?' : 匹配任意單個字符
  3. '[]' : 匹配指定范圍內(nèi)的任意單個字符
  4. '[^]' : 匹配指定范圍外的任意單個字符

而在正則表達(dá)式中磷账,元字符的特定意義為:

  1. '.': 表示任意單個字符
  2. '[]': 匹配指定范圍內(nèi)的任意單個字符
  3. '[^]': 匹配指定范圍外的任意單個字符
  4. '*': 表示匹配其前面的字符任意次
  5. '.*': 表示任意長度的任意字符
  6. '?': 表示匹配其前面的字符1次或0次
  7. '\{m, n\}': 表示匹配其前面的字符至少m次,至多n次

除了這些特定的元字符的意義外贾虽,正如文件通配符中所描述的字符集合逃糟,正則表達(dá)式同樣支持字符集合:

  1. [:space:] 表示空白字符
  2. [:punct:] 表示標(biāo)點(diǎn)符號
  3. [:lower:] 表示小寫字母
  4. [:upper:] 表示大寫字母
  5. [:alpha:] 表示大小寫字母
  6. [:digit:] 表示數(shù)字
  7. [:alnum:] 表示數(shù)字和大小寫字母
元字符示例
# 示例解析

$ grep 'a.b' test.txt
它只能匹配a與b之間存在一個字符的字符串,而之間存在的字符串是什么是任意的蓬豁。因此輸出結(jié)果只有 aab, acb, adb

$ grep 'a*b' test.txt
它匹配的是以b結(jié)尾绰咽,b前面具有任意個a的字符串,任意個包括零個地粪,因此它只匹配到了 b, ab, aab 而 acb adb amnbamnbamnb 也之所以顯示出來取募,是因?yàn)間rep的本身意義做的是部分匹配,只要改行有匹配到的內(nèi)容就把該行顯示出來驶忌。

$ grep 'a.*b' test.txt
它匹配的是以a開頭矛辕,b結(jié)尾笑跛,中間可以存在任意個字符,且可以是任意字符聊品。因此它就把a(bǔ)開頭b結(jié)尾的所以字符都顯示了出來飞蹂,ab, aab, acb, adb, amnbamnbamnb

$ grep 'a\?' test.txt
它匹配包含一次a或者0次a的字符串,所以只要有a翻屈,就可以被檢測出來陈哑,結(jié)果就如上了。

$ grep 'a\{1,\}b' test.txt
它匹配b前面最少有一次a的字符串伸眶,也就是ab, aab, aaab等等惊窖,所以結(jié)果如上。

$ grep 'a\{0,3\}' test.txt
它匹配包含最多三個a厘贼,所以結(jié)果如上界酒。

位置錨定

位置錨定,就是在進(jìn)行搜索的時候嘴秸,所搜索的字符必須出現(xiàn)在特定的位置毁欣。

  1. '^': 錨定行首,此字符后面的任意字符串內(nèi)容必須出現(xiàn)在行首岳掐。

  2. '$': 錨定行尾凭疮,此字符前面的任意字符串內(nèi)容必須出現(xiàn)在行尾。

  3. '^$': 錨定空白行串述,也就是搜索文件中的空白行执解。

  4. '\<'或'\b': 錨定單詞首部,此字符后面的任意字符串必須出現(xiàn)在單詞首部纲酗。

  5. '\>'或'\b': 錨定單詞尾部衰腌,此字符后面的任意字符串必須出現(xiàn)在單詞尾部。

    notice: 這里單詞的含義并不特指英文的單詞耕姊,它只要以一個字符開始桶唐,以一個字符結(jié)束,中間只要沒有出現(xiàn)特殊字符茉兰,它這個字符串整體就叫做單詞,而這特殊字符包括: . :

位置錨定示例
# 示例解析

$ grep '^r..t' test.txt
它將匹配到r..t的字符串欣簇,并且還是位于行首的行顯示出來规脸。

$ grep 'r..t$' test.txt
它將匹配到r..t的字符串,并且還是位于行尾的行顯示出來熊咽。

$ grep '^$' test.txt
它將空白行顯示出來

$ grep 'fork\>' test.txt
它將匹配到的字符fork莫鸭,并且還是位于單詞尾部的行顯示了出來。

$ grep '\<ar' test.txt
它將匹配到的字符ar, 并且還是位于單詞首部的行顯示了出來横殴。

$ grep '\<useful\>' test.txt
它將匹配到的字符useful, 并且是整個單詞的行顯示了出來被因。

分組

分組的意義卿拴,通俗的來講,就是將一捆字符作為一個整體來看待梨与,用\(\)來表示堕花。

例如:\(ab\)* 將ab作為一個整體,星號修飾的ab這一個整體粥鞋。而ab*僅僅修飾b一個字符

$ grep '\(ab\)*' test.txt

上面這個命令就表示在文件test.txt中匹配ab這一整體缘挽,它可以匹配到ab, abab, ababab這樣。

后向引用

與分組搭配使用的還有后向引用呻粹。

\1: 引用第一個左括號以及與之對應(yīng)的右括號所包括的所有內(nèi)容

$ grep '\([0-9]\).*\1$' /etc/inittab

\2: 引用第二個左括號以及與之對應(yīng)的右括號所包括的所有內(nèi)容

\3: 引用第三個左括號以及與之對應(yīng)的右括號所包括的所有內(nèi)容

<練習(xí)>

以單個空格加單個數(shù)字結(jié)尾的行

$ grep '[[:space:]][[:digit:]]$' /etc/inittab

擴(kuò)展正則表達(dá)式

擴(kuò)展正則表達(dá)式與正則表達(dá)式在很多地方的意義都是相同的壕曼。例如:

  • 字符匹配:. [] [^]

    次數(shù)匹配:* ? {m,n}

  • 位置錨定;

  • 分組等浊;

NOTICE:

  1. 次數(shù)匹配中的?和{m,n}不需要加反斜線 \
  2. 分組也不需要加反斜線腮郊,而且這里的分組才真正意義上實(shí)現(xiàn)了分組的意義。也支持\1, \2, \3的引用筹燕。

除了與正則表達(dá)式相同意義的地方轧飞,擴(kuò)展表達(dá)式也有其獨(dú)特的地方:

  • 次數(shù)匹配中 + 加號代表基本正則表達(dá)式中的 \{1,\},所以加號代表匹配其前面的字符至少一次

  • 支持邏輯或:a|b = a 或 b

    C|cat: C或cat $ grep --color -E 'C|cat' test.txt

    (C|c)at: Cat或cat $ grep --color -E '(C|c)at' test6.txt

  • grep -E = egrep

    egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' /boot/grub/grub.conf

練習(xí)

  1. 找出ifconfig命令中0-255之間的數(shù)字
  2. 找出ifconfig命令中形如x.x.x.x格式的數(shù)字格式
  3. 找出ifconfig命令中的ip地址

答案

  1. ifconfig | egrep --color '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

  2. ifconfig | egrep --color '(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

    ifconfig | egrep --color '(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\1'

  3. ifconfig | egrep --color '\<[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3]\>(\.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>'

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庄萎,一起剝皮案震驚了整個濱河市踪少,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌糠涛,老刑警劉巖援奢,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異忍捡,居然都是意外死亡集漾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門砸脊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來具篇,“玉大人,你說我怎么就攤上這事凌埂∏裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵瞳抓,是天一觀的道長埃疫。 經(jīng)常有香客問我,道長孩哑,這世上最難降的妖魔是什么栓霜? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮横蜒,結(jié)果婚禮上胳蛮,老公的妹妹穿的比我還像新娘销凑。我一直安慰自己,他們只是感情好仅炊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布斗幼。 她就那樣靜靜地躺著,像睡著了一般茂洒。 火紅的嫁衣襯著肌膚如雪孟岛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天督勺,我揣著相機(jī)與錄音渠羞,去河邊找鬼。 笑死智哀,一個胖子當(dāng)著我的面吹牛次询,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓷叫,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屯吊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摹菠?” 一聲冷哼從身側(cè)響起盒卸,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎次氨,沒想到半個月后蔽介,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡煮寡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年虹蓄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幸撕。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡薇组,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坐儿,到底是詐尸還是另有隱情律胀,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布貌矿,位于F島的核電站累铅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏站叼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一菇民、第九天 我趴在偏房一處隱蔽的房頂上張望尽楔。 院中可真熱鬧投储,春花似錦、人聲如沸阔馋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呕寝。三九已至勋眯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間下梢,已是汗流浹背客蹋。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孽江,地道東北人讶坯。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像岗屏,于是被迫代替她去往敵國和親辆琅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容