grep與正則表達(dá)式

上回說到grep與正則表達(dá)式關(guān)系緊密,今天來詳細(xì)的談一談。

1. 簡介

正則表達(dá)式,讓人不明覺厲,望而卻步。但實(shí)際上它就相當(dāng)于數(shù)學(xué)里的九九乘法表,背會很難,之后做乘法就很快了。

正則表達(dá)式也是這樣的工具,看起來很難,背會了之后大有幫助。乘法表建立了乘法的基礎(chǔ)規(guī)則,而正則表達(dá)式建立了一系列語法的規(guī)則。它是用來匹配符合某種語法的字符串,從而可以對這些篩選出來的字符串進(jìn)行處理。

所以天然的,在Linux中,grep命令經(jīng)常與正則表達(dá)式結(jié)合起來執(zhí)行一些模糊查詢或者指向性查詢。

比如一些常見的:

ll | grep -E "*.txt"  
    #列出當(dāng)前路徑下的txt文件
    #-E選項(xiàng)表示使用擴(kuò)展的正則表達(dá)式,grep -E相當(dāng)于egrep
    #"*"就是一種正則表達(dá)式的元字符

【注】其實(shí)直接使用ll *.txt也能得到相同結(jié)果,這是因?yàn)長inux直接把*解釋為任意的字符串。

二、正則表達(dá)式基礎(chǔ)

正則表達(dá)式是如何建立語法規(guī)則的呢?它定義了一系列的元字符(像"*"這樣的),通過元字符和其他字符的組合來表達(dá)出一種規(guī)則,對待匹配文本進(jìn)行篩選,只有符合這種規(guī)則的文本才能被保留下來。


篩選過程
  • 基本正則表達(dá)式所定義的元字符
元字符 作用 例子 例子說明
^ 行首定位符 ^ty 匹配"t"開頭,后面緊跟一個"y"的字符串
$ 行尾定位符 txt$ 匹配以"t"結(jié)尾,前面兩個字符是"t""x"的字符串
. 單個字符匹配 s. 匹配"s"后面有一個字符的字符串
* 限定符 s* "*"表示匹配其前導(dǎo)字符若干次,包括0次。這里是匹配有若干個"s"的字符串
[] 字符集匹配 [abc] 表示匹配"a","b"或"c"的字符串
[^] 字符集不匹配 [^abc 表示不匹配"a","b","c"里的任意字符
() 子表達(dá)式 ([0-9]{2})? 匹配兩個或0個數(shù)字
x{m,n} 區(qū)間表達(dá)式 a{2,3} 表示"a"重復(fù)2~3次
  • 擴(kuò)展正則表達(dá)式的元字符
元字符 作用 例子 例子說明
+ 限定符,同* s+ "+"表示匹配其前導(dǎo)字符若干次,至少1次
? 限定符 ss? "?"表示前面的字符可以重復(fù)0或1次。這里是一個"s"后面可能再跟一個"s"
  • POSIX字符集

不同國家的字符編碼很有可能不同,例如:
LANG=C:A B C D ... Z a b c d ...z
LANG=zh_TW:a A b B c C d D ... z Z

當(dāng)采用第二種編碼時,[A-Z]之間會包括小寫字母b-z。所以為了避免這種問題,可以使用POSIX字符集來使用特定的字符類。

字符類 說明
[:alnum:] 匹配任意一個字母或者數(shù)字,等價于A-Za-z0-9
[:alpha:] 匹配任意一個字母,等價于A-Za-z
[:digit:] 匹配任意一個數(shù)字,等價于0-9
[:lower:] 匹配小寫字母,等價于a-z
[:upper:] 匹配大寫字母,等價于A-Z
[:graph:] 匹配一個看的見的字符,不包括空白字符
[:print:] 匹配一個可以打印的字符
[:blank:] 匹配空格和tab
[:space:] 匹配一個空白字符,包括空格、tab、換行、分頁符<
[:punct:] 匹配一個標(biāo)點(diǎn)符號
[:xdigit:] 匹配一個十六進(jìn)制數(shù)字,即0-9,a-f,A-F

【注意】這些字符類要放在方括號中,才能表示字符集匹配:[[:alnum:]] = [A-Za-z0-9]

三、grep與正則表達(dá)式的例子

(1)簡單匹配

#匹配空行
egrep "^$" testfile    

#匹配所有英文字符
egrep "[a-zA-Z]" testfile

#匹配tast或者test
egrep "t[ae]st" testfile
#匹配以字符s開頭,緊跟若干b的文件名
ll | egrep "^sb*"

#匹配txt文件
ll | egrep "\.txt$"      #這里的"."需要進(jìn)行轉(zhuǎn)義

(2)復(fù)雜一些的匹配

#匹配QQ號碼,第一位不能是0,5位以上的數(shù)字。
egrep "[1-9][0-9]{4,}" testfile

#匹配IP地址,共4組數(shù)字,用"."隔開
egrep "^([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.   #第一組數(shù)字
        ([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.   #第二組數(shù)字
        ([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.   #第三組數(shù)字
        ([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"   #第四組數(shù)字
        testfile 

#匹配郵箱地址
egrep "^[a-z0-9]([a-z0-9]*[-_]?[a-z0-9]+)*@
       ([a-z0-9]*[-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?$"

此處注意:區(qū)間表達(dá)式{}應(yīng)該寫成"\{\}"表示轉(zhuǎn)義,實(shí)驗(yàn)中發(fā)現(xiàn)加不加"\"轉(zhuǎn)義都能得出正確結(jié)果,但是直接使用基本正則表達(dá)式(grep不加-E選項(xiàng))則不行。所以應(yīng)該是擴(kuò)展正則表達(dá)式中取消了這個需要轉(zhuǎn)義字符的地方。

四、其他

瑣碎的片段:

  1. 當(dāng)需要將元字符當(dāng)作普通字符匹配的時候,需要轉(zhuǎn)移字符"\",但是當(dāng)元字符位于"[]"中時,除了"-"或者"^"極少數(shù)元字符以外,其它的自動轉(zhuǎn)義為普通字符。

  2. 正則表達(dá)式從左到右計算,遵循一定的優(yōu)先級:轉(zhuǎn)義符"\" > 方括號"[]" > 分組 "()" > 限定符"*,+,?,{}" > 普通字符 > 定位符"^,$" > 或"|"。

  3. 匹配同一種字符可能有多種正則表達(dá)式的寫法。

  4. shell本身不支持正則表達(dá)式,但是支持"*","?"等通配符。

  5. 支持正則表達(dá)式的還有sed命令,awk命令。以后可以詳述。

  6. 參考:
    shell從入門到精通,張春曉等編著;
    鳥哥的Linux私房菜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,285評論 2 376

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