文本處理——grep,egrep奈搜,fgrep與正則

一、grep

grep鄙麦,(global search regular expression(RE) and print out the line)一個文本過濾工具典唇,作為小白的我常常只用它的最基本的功能,比如說grep root /etc/passwd 來在passwd文件中過濾root關(guān)鍵字胯府〗橄危可是要想脫離小白,就必須要學(xué)它的高級功能了骂因,但是高級功能需要依靠神奇般的正則表達式來完成炎咖,現(xiàn)在先一塊和我看看它的常用用法吧

不帶參數(shù)的用法:

# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

帶參數(shù)的用法:

--color=auto:  對匹配到的文本著色顯色,默認centos7中,grep的別名中乘盼,已經(jīng)將這個選項定義為別名
-v:顯示不被pattern匹配到的行
-i:忽略字符大小寫
-n:顯示匹配的行號
-c:統(tǒng)計匹配的行數(shù)
-o:僅顯示匹配到的字符串
-q:靜默模式升熊,不輸出任何信息(quiet,可以結(jié)合echo $?狀態(tài)碼使用)
-A NUM after, 包含匹配行的后NUM行
-B NUM:before, 包含匹配行的前NUM行
-C NUM context, 包含匹配行的前后各NUM行
-e: 實現(xiàn)多個選項間的邏輯or關(guān)系
-w匹配整個單詞(字母绸栅、下劃線级野、數(shù)字漢字,這幾個連在一起算一個單詞)
-E使用ERE
-F相當于fgrep粹胯,不支持正則表達式

注意1:grep匹配字符時候蓖柔,是按照行來顯示,也就是說风纠,在某一行匹配到字符况鸣,默認是將這一行完整的顯示出來,如果加上-o選項议忽,那么只是將匹配到的顯示出來懒闷。例如:

[root@CentOS7 ~]# grep -o root /etc/passwd
root
root
root
root     #在文本中查找到了四個root,每查找到一個顯示到一行
[root@CentOS7 ~]# 

注意2:grep -q 是靜默模式查找栈幸,什么叫靜默模式啊愤估,靜默模式就是在文本查找到,不在屏幕上顯示出來速址,我就有疑問了玩焰,不顯示出來,那還要它何用芍锚,不要著急昔园,存在即合理,待我講一講它的細節(jié):
我們知道并炮,shell腳本并不是一門編程語言默刚,他是一個命令解釋器,也就是說是把一堆命令放在一個文件中一塊執(zhí)行的逃魄,這就是shell腳本荤西,那么作為一個重要的命令,grep當然要在shell腳本中插一腳了伍俘,就是說他能在shell腳本中運行邪锌,在shell腳本中運行,則只需要讓機器懂就行了癌瘾,機器懂的只有0和1觅丰,那么靜默模式就有他的用武之地了,如果模板搜索成功妨退,則返回0妇萄,如果搜索不成功蜕企,則返回1,如果搜索的文件不存在嚣伐,則返回2糖赔,這樣,grep也能在shell腳本中大行其道了~


二轩端、egrep

egrep 代表擴展的正則表達式放典,它和正則表達式思想相同,只不過在寫正則表達式時候基茵,省去了一些讓人混亂的"",因為\代表轉(zhuǎn)義奋构,在我們用到比如說“{}”,時候拱层,我們就需要加上\來表示匹配多次弥臼。


三、fgrep

fgrep就是fixed grep或fast grep根灯,它們把所有的字母都看作單詞径缅,也就是說,正則表達式中的元字符表示回其自身的字面意義烙肺,不再特殊纳猪。由于其省去了要匹配的正則表達式,速度比grep ,egrep都要快桃笙。


四氏堤、正則表達式

Regular Expression,正則表達式搏明,簡寫為RegExp

  • BRE :Basic RegExp鼠锈,基本正則表達式
  • ERE :Extend RegExp ,擴展的正則表達式
  • PCRE(Perl Compatible Regular Expressions)

正則表達式有以下知識點星著,只要你將其掌握购笆,你將出身入化,讓我們一塊看看吧

  1. 字符匹配
  2. 匹配次數(shù)
  3. 位置錨定
  4. 分組與 后向引用
  5. 查看正則幫助(man 7 regex)

1.字符匹配:

. 匹配任意單個字符:如r..t
[] 匹配指定范圍內(nèi)的任意單個字符:如[abc]r
[^] 匹配指定范圍外的任意單個字符:如[^abc]r
[:alnum:] 字母和數(shù)字
[:alpha:] 代表任何英文大小寫字符虚循,亦即 A-Z, a-z
[:lower:] 小寫字母
[:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格由桌、刪除、警鈴…)
[:digit:] 十進制數(shù)字 [:xdigit:]十六進制數(shù)字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號

2.匹配次數(shù)

* 匹配前面的字符任意次邮丰,包括0次(貪婪模式,盡可能長的匹配)
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次铭乾,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次    #相信聰明的你一定看出來其中的規(guī)律了剪廉,我不多說了

3.位置錨定

^ 行首錨定,用于模式的最左側(cè)(要跟字符匹配里的[^]區(qū)分開炕檩,那個是在中括號里面的)
比如說查找文本中以空格開頭的行可以用如下代碼
grep "^[[:space:]]" file
$ 行尾錨定斗蒋,用于模式的最右側(cè)

^PATTERN$ 用于模式匹配整行

^$ 空行

^[[:space:]]*$ 空白行

\< 或 \b 詞首錨定捌斧,用于單詞模式的左側(cè),表示匹配以..字符開頭的單詞

\> 或 \b 詞尾錨定泉沾;用于單詞模式的右側(cè),表示匹配以..字符結(jié)尾的單詞

\<PATTERN\> 匹配整個單詞

4.分組與后向引用

\(\)將一個或多個字符捆綁在一起捞蚂,當作一個整體進 行處理,
如:\(root\)\+

分組括號中的模式匹配到的內(nèi)容會被正則表達式引擎記錄于 內(nèi)部的變量中跷究,
這些變量的命名方式為: \1, \2, \3, …
\1 表示從左側(cè)起第一個左括號以及與之匹配右括號之間的 模式所匹配到的字符

示例:

\(string1\+\(string2\)*\)

\1 :string1\+\(string2\)*

\2 :string2

后向引用:引用前面的分組括號中的模式所匹配字符姓迅,而非模式本身,
也就是說前面括號里匹配到的是"str1",后向引用的也要找到"str1",才算匹配成功。

grep "\(root\).*\1" /etc/passwd  #表示的是查找到root和root之間有任意字符的行俊马。
[root@CentOS7 ~]# grep "\(root\).*\1" /etc/passwd
root:x:0:0:root:/root:/bin/bash
arooter:x:1001:1001::/home/arooter:/bin/bash

5.或

\|

示例:
a\|b: a或b

C\|cat: C或cat

(C\|c)at:Cat或cat
來一個匹配ip地址的示例:

ip a| grep -o '\(\([0-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\([0-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)'

6.查看幫助man 7 regex

對于能看下去英語的人丁存,絕對實用。對于我這只能自己看懂柴我,不能講出來的人解寝,還是不多說什么了以免誤導(dǎo)


五、擴展的正則表達式

egrep == grep -e

egrep其實很簡單艘儒,就是把grep里的斜線去掉了聋伦,不過有些還沒有去掉。
沒有去掉斜線的有

<, \b :語首

>, \b :語尾

六界睁、這里需要加上練習(xí)蹂躡一下你

grep練習(xí)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末觉增,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晕窑,更是在濱河造成了極大的恐慌抑片,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杨赤,死亡現(xiàn)場離奇詭異敞斋,居然都是意外死亡,警方通過查閱死者的電腦和手機疾牲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門植捎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阳柔,你說我怎么就攤上這事焰枢。” “怎么了舌剂?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵济锄,是天一觀的道長。 經(jīng)常有香客問我霍转,道長荐绝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任避消,我火速辦了婚禮低滩,結(jié)果婚禮上召夹,老公的妹妹穿的比我還像新娘。我一直安慰自己恕沫,他們只是感情好监憎,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著婶溯,像睡著了一般鲸阔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爬虱,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天隶债,我揣著相機與錄音,去河邊找鬼跑筝。 笑死死讹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的曲梗。 我是一名探鬼主播赞警,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虏两!你這毒婦竟也來了愧旦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤定罢,失蹤者是張志新(化名)和其女友劉穎笤虫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祖凫,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡琼蚯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惠况。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遭庶。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稠屠,靈堂內(nèi)的尸體忽然破棺而出峦睡,到底是詐尸還是另有隱情,我是刑警寧澤权埠,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布榨了,位于F島的核電站,受9級特大地震影響攘蔽,放射性物質(zhì)發(fā)生泄漏阻逮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一秩彤、第九天 我趴在偏房一處隱蔽的房頂上張望叔扼。 院中可真熱鬧,春花似錦漫雷、人聲如沸瓜富。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽与柑。三九已至,卻和暖如春蓄坏,著一層夾襖步出監(jiān)牢的瞬間价捧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工涡戳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留结蟋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓渔彰,卻偏偏與公主長得像嵌屎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恍涂,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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