這部分內(nèi)容可以說是學(xué)習(xí)shell腳本之前必學(xué)的內(nèi)容。如果你這部分內(nèi)容學(xué)的越好倒淫,那么你的shell腳本編寫能力就會(huì)越強(qiáng)伙菊。所以不要嫌這部分內(nèi)容啰嗦,也不要怕麻煩,要用心學(xué)習(xí)镜硕。一定要多加練習(xí)运翼,練習(xí)多了就能熟練掌握了。
在計(jì)算機(jī)科學(xué)中兴枯,正則表達(dá)式是這樣解釋的:它是指一個(gè)用來描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串血淌。在很多文本編輯器或其他工具里,正則表達(dá)式通常被用來檢索和/或替換那些符合某個(gè)模式的文本內(nèi)容念恍。許多程序設(shè)計(jì)語言都支持利用正則表達(dá)式進(jìn)行字符串操作六剥。對于系統(tǒng)管理員來講,正則表達(dá)式貫穿在我們的日常運(yùn)維工作中峰伙,無論是查找某個(gè)文檔疗疟,抑或查詢某個(gè)日志文件分析其內(nèi)容,都會(huì)用到正則表達(dá)式瞳氓。
其實(shí)正則表達(dá)式策彤,只是一種思想,一種表示方法匣摘。只要我們使用的工具支持表示這種思想那么這個(gè)工具就可以處理正則表達(dá)式的字符串店诗。常用的工具有g(shù)rep, sed, awk 等,下面筆者就介紹一下這三種工具的使用方法音榜。
【grep / egrep】
語法: grep [-cinvABC] ‘word’ filename
-c :打印符合要求的行數(shù)
-i :忽略大小寫
-n :在輸出符合要求的行的同時(shí)連同行號一起輸出
-v :打印不符合要求的行
-A :后跟一個(gè)數(shù)字(有無空格都可以)庞瘸,例如 –A2則表示打印符合要求的行以及下面兩行
-B :后跟一個(gè)數(shù)字,例如 –B2 則表示打印符合要求的行以及上面兩行
-C :后跟一個(gè)數(shù)字赠叼,例如 –C2 則表示打印符合要求的行以及上下各兩行
舉幾個(gè)小例子幫助你好好掌握這個(gè)grep工具的用法擦囊。
a. 過濾出帶有某個(gè)關(guān)鍵詞的行并輸出行號
b. 過濾不帶有某個(gè)關(guān)鍵詞的行,并輸出行號
c. 過濾出所有包含數(shù)字的行
在前面也提到過這個(gè)”[ ]”的應(yīng)用嘴办,如果是數(shù)字的話就用[0-9]這樣的形式瞬场,當(dāng)然有時(shí)候也可以用這樣的形式[15]即只含有1或者5,注意涧郊,它不會(huì)認(rèn)為是15贯被。如果要過濾出數(shù)字以及大小寫字母則要這樣寫[0-9a-zA-Z]。另外[ ]還有一種形式妆艘,就是[^字符] 表示除[ ]內(nèi)的字符之外的字符彤灶。
這就表示篩選包含oo字符串,但是不包含r字符双仍。
d. 過濾出文檔中以某個(gè)字符開頭或者以某個(gè)字符結(jié)尾的行
在正則表達(dá)式中枢希,””表示行的開始,”$”表示行的結(jié)尾朱沃,那么空行則表示”$”,如果你只想篩選出非空行苞轿,則可以使用 “grep -v ‘^$’ filename”得到你想要的結(jié)果∶┯眨現(xiàn)在想一下,如何打印出不以英文字母開頭的行呢搬卒?
e. 過濾任意一個(gè)字符與重復(fù)字符
“.”表示任意一個(gè)字符瑟俭,上例中,就是把符合r與o之間有兩個(gè)任意字符的行過濾出來契邀。
“*”表示零個(gè)或多個(gè)前面的字符摆寄。
‘ooo’ 表示oo, ooo, oooo … 或者更多的’o’∮徊停現(xiàn)在你是否想到了’.’ 這個(gè)組合表示什么意義司浪?
‘.*’表示零個(gè)或多個(gè)任意字符,空行也包含在內(nèi)乒融。
f. 指定要過濾字符出現(xiàn)的次數(shù)
這里用到了{(lán) }古戴,其內(nèi)部為數(shù)字欠橘,表示前面的字符要重復(fù)的次數(shù)。上例中表示包含有兩個(gè)o 即’oo’的行现恼。注意肃续,{ }左右都需要加上脫意字符’\’。另外叉袍,使用{ }我們還可以表示一個(gè)范圍的始锚,具體格式是 ‘{n1,n2}’其中n1<n2,表示重復(fù)n1到n2次前面的字符喳逛,n2還可以為空瞧捌,則表示大于等于n1次。
上面部分講的grep润文,另外筆者常常用到egrep這個(gè)工具察郁,簡單點(diǎn)講,后者是前者的擴(kuò)展版本转唉,我們可以用egrep完成grep不能完成的工作,當(dāng)然了grep能完成的egrep完全可以完成稳捆。如果你嫌麻煩赠法,egrep了解一下即可,因?yàn)間rep的功能已經(jīng)足夠可以勝任你的日常工作了乔夯。