這部分內(nèi)容可以說是學習shell腳本之前必學的內(nèi)容。如果你這部分內(nèi)容學的越好,那么你的shell腳本編寫能力就會越強。所以不要嫌這部分內(nèi)容啰嗦,也不要怕麻煩,要用心學習。一定要多加練習,練習多了就能熟練掌握了。
在計算機科學中,正則表達式是這樣解釋的:它是指一個用來描述或者匹配一系列符合某個句法規(guī)則的字符串的單個字符串。在很多文本編輯器或其他工具里,正則表達式通常被用來檢索和/或替換那些符合某個模式的文本內(nèi)容。許多程序設計語言都支持利用正則表達式進行字符串操作。對于系統(tǒng)管理員來講,正則表達式貫穿在我們的日常運維工作中,無論是查找某個文檔,抑或查詢某個日志文件分析其內(nèi)容,都會用到正則表達式。
其實正則表達式,只是一種思想,一種表示方法。只要我們使用的工具支持表示這種思想那么這個工具就可以處理正則表達式的字符串。常用的工具有grep, sed, awk 等,下面筆者就介紹一下這三種工具的使用方法。
【grep / egrep】
筆者在前面的內(nèi)容中多次提到并用到grep命令,可見它的重要性。所以好好學習一下這個重要的命令吧。你要知道的是grep連同下面講的sed, awk都是針對文本的行才操作的。
語法: grep [-cinvABC] ‘word’ filename
-c :打印符合要求的行數(shù)
-i :忽略大小寫
-n :在輸出符合要求的行的同時連同行號一起輸出
-v :打印不符合要求的行
-A :后跟一個數(shù)字(有無空格都可以),例如 –A2則表示打印符合要求的行以及下面兩行
-B :后跟一個數(shù)字,例如 –B2 則表示打印符合要求的行以及上面兩行
-C :后跟一個數(shù)字,例如 –C2 則表示打印符合要求的行以及上下各兩行
以下,筆者舉幾個小例子幫助你好好掌握這個grep工具的用法。
a. 過濾出帶有某個關(guān)鍵詞的行并輸出行號
b. 過濾不帶有某個關(guān)鍵詞的行,并輸出行號
c. 過濾出所有包含數(shù)字的行
在前面也提到過這個”[ ]”的應用,如果是數(shù)字的話就用[0-9]這樣的形式,當然有時候也可以用這樣的形式[15]即只含有1或者5,注意,它不會認為是15。如果要過濾出數(shù)字以及大小寫字母則要這樣寫[0-9a-zA-Z]。另外[ ]還有一種形式,就是[^字符] 表示除[ ]內(nèi)的字符之外的字符。
這就表示篩選包含oo字符串,但是不包含r字符。
d. 過濾出文檔中以某個字符開頭或者以某個字符結(jié)尾的行
在正則表達式中,”^”表示行的開始,”$”表示行的結(jié)尾,那么空行則表示”^$”,如果你只想篩選出非空行,則可以使用 “grep -v ‘^$’ filename”得到你想要的結(jié)果。現(xiàn)在想一下,如何打印出不以英文字母開頭的行呢?
e. 過濾任意一個字符與重復字符
“.”表示任意一個字符,上例中,就是把符合r與o之間有兩個任意字符的行過濾出來。
“*”表示零個或多個前面的字符。
‘ooo’ 表示oo, ooo, oooo … 或者更多的’o’。現(xiàn)在你是否想到了’.’ 這個組合表示什么意義?
‘.*’表示零個或多個任意字符,空行也包含在內(nèi)。
f. 指定要過濾字符出現(xiàn)的次數(shù)
這里用到了{ },其內(nèi)部為數(shù)字,表示前面的字符要重復的次數(shù)。上例中表示包含有兩個o 即’oo’的行。注意,{ }左右都需要加上脫意字符’\’。另外,使用{ }我們還可以表示一個范圍的,具體格式是 ‘\’其中n1<n2,表示重復n1到n2次前面的字符,n2還可以為空,則表示大于等于n1次。
上面部分講的grep,另外筆者常常用到egrep這個工具,簡單點講,后者是前者的擴展版本,我們可以用egrep完成grep不能完成的工作,當然了grep能完成的egrep完全可以完成。如果你嫌麻煩,egrep了解一下即可,因為grep的功能已經(jīng)足夠可以勝任你的日常工作了。下面筆者介紹egrep不用于grep的幾個用法。為了試驗方便,筆者把test.txt 編輯成如下內(nèi)容:
rot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
a. 篩選一個或一個以上前面的字符
和grep 不同的是,egrep這里是使用’+’的。
b. 篩選零個或一個前面的字符
c. 篩選字符串1或者字符串2
中間有一個’|’表示或者的意思,筆者用這個用的很多,所以這個你最好記一下。
d. egrep中’( )’的應用
用’( )’表示一個整體,例如(oo)+就表示1個’oo’或者多個’oo’
【sed 工具的使用】
grep 工具的功能其實還不夠強大,其實說白了,grep實現(xiàn)的只是查找功能,而它卻不能實現(xiàn)把查找的內(nèi)容替換掉。以前用vim的時候,可以查找也可以替換,但是只局限于在文本內(nèi)部來操作,而不能輸出到屏幕上。sed工具以及下面要講的awk工具就能實現(xiàn)把替換的文本輸出到屏幕上的功能了,而且還有其他更豐富的功能。sed和awk都是流式編輯器,是針對文檔的行來操作的。
a. 打印某行 sed -n ‘n’p filename 單引號內(nèi)的n是一個數(shù)字,表示第幾行
b. 打印多行打印整個文檔用 -n ‘1,$’p
c. 打印包含某個字符串的行
上面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同樣也能在sed中使用。
d. -e 可以實現(xiàn)多個行為
e. 刪除某行或者多行
‘d’ 這個字符就是刪除的動作了,不僅可以刪除指定的單行以及多行,而且還可以刪除匹配某個字符的行,另外還可以刪除從某一行一直到文檔末行。
f. 替換字符或字符串
更多建議: