Linux 正則表達(dá)式

2018-12-06 17:50 更新

Linux 正則表達(dá)式

這部分內(nèi)容可以說是學(xué)習(xí)shell腳本之前必學(xué)的內(nèi)容如果你這部分內(nèi)容學(xué)的越好,那么你的shell腳本編寫能力就會越強(qiáng)。所以不要嫌這部分內(nèi)容啰嗦,也不要怕麻煩,要用心學(xué)習(xí)一定要多加練習(xí),練習(xí)多了就能熟練掌握了。

在計(jì)算機(jī)科學(xué)中,正則表達(dá)式是這樣解釋的:它是指一個用來描述或者匹配一系列符合某個句法規(guī)則的字符串的單個字符串。在很多文本編輯器或其他工具里,正則表達(dá)式通常被用來檢索和/或替換那些符合某個模式的文本內(nèi)容。許多程序設(shè)計(jì)語言都支持利用正則表達(dá)式進(jìn)行字符串操作。對于系統(tǒng)管理員來講,正則表達(dá)式貫穿在我們的日常運(yùn)維工作中,無論是查找某個文檔,抑或查詢某個日志文件分析其內(nèi)容,都會用到正則表達(dá)式

其實(shí)正則表達(dá)式,只是一種思想,一種表示方法。只要我們使用的工具支持表示這種思想那么這個工具就可以處理正則表達(dá)式的字符串常用的工具有grep, sed, awk 等,下面筆者就介紹一下這三種工具的使用方法。

grep / egrep

筆者在前面的內(nèi)容中多次提到并用到grep命令,可見它的重要性所以好好學(xué)習(xí)一下這個重要的命令吧。你要知道的是grep連同下面講的sed, awk都是針對文本的行才操作的。

語法: grep [-cinvABC] ‘word’ filename

-c :打印符合要求的行數(shù)

-i :忽略大小寫

-n :在輸出符合要求的行的同時連同行號一起輸出

-v :打印不符合要求的行

-A :后跟一個數(shù)字(有無空格都可以),例如 –A2則表示打印符合要求的行以及下面兩行

-B :后跟一個數(shù)字,例如 –B2 則表示打印符合要求的行以及上面兩行

-C :后跟一個數(shù)字,例如 –C2 則表示打印符合要求的行以及上下各兩行

13_1.png.jpg

以下,筆者舉幾個小例子幫助你好好掌握這個grep工具的用法

a. 過濾出帶有某個關(guān)鍵詞的行并輸出行號

13_7.png.jpg

b. 過濾不帶有某個關(guān)鍵詞的行,并輸出行號

13_8.png.jpg

c. 過濾出所有包含數(shù)字的行

13_9.png.jpg

在前面也提到過這個”[ ]”的應(yīng)用,如果是數(shù)字的話就用[0-9]這樣的形式,當(dāng)然有時候也可以用這樣的形式[15]即只含有1或者5,注意,它不會認(rèn)為是15。如果要過濾出數(shù)字以及大小寫字母則要這樣寫[0-9a-zA-Z]。另外[ ]還有一種形式,就是[^字符] 表示除[ ]內(nèi)的字符之外的字符。

13_10.png.jpg

這就表示篩選包含oo字符串,但是不包含r字符。

d. 過濾出文檔中以某個字符開頭或者以某個字符結(jié)尾的行

13_11.png.jpg

在正則表達(dá)式中,”^”表示行的開始,”$”表示行的結(jié)尾,那么空行則表示”^$”,如果你只想篩選出非空行,則可以使用 “grep -v ‘^$’ filename”得到你想要的結(jié)果。現(xiàn)在想一下,如何打印出不以英文字母開頭的行呢?

13_21.png.jpg

e. 過濾任意一個字符與重復(fù)字符

13_22.png.jpg

“.”表示任意一個字符,上例中,就是把符合ro之間有兩個任意字符的行過濾出來。

“*”表示零個或多個前面的字符。

13_23.png.jpg

‘ooo 表示oo, ooo, oooo … 或者更多的’o’。現(xiàn)在你是否想到了’.’ 這個組合表示什么意義?

13_24.png.jpg

‘.*’表示零個或多個任意字符,空行也包含在內(nèi)。

f. 指定要過濾字符出現(xiàn)的次數(shù)

13_25.png.jpg

這里用到了{ },其內(nèi)部為數(shù)字,表示前面的字符要重復(fù)的次數(shù)。上例中表示包含有兩個o ’oo’的行。注意,{ }左右都需要加上脫意字符’\’。另外,使用{ }我們還可以表示一個范圍的,具體格式是 ‘\’其中n1<n2,表示重復(fù)n1n2次前面的字符,n2還可以為空,則表示大于等于n1

上面部分講的grep,另外筆者常常用到egrep這個工具,簡單點(diǎn)講,后者是前者的擴(kuò)展版本,我們可以用egrep完成grep不能完成的工作,當(dāng)然了grep能完成的egrep完全可以完成。如果你嫌麻煩,egrep了解一下即可,因?yàn)?/span>grep的功能已經(jīng)足夠可以勝任你的日常工作了下面筆者介紹egrep不用于grep的幾個用法。為了試驗(yàn)方便,筆者把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. 篩選一個或一個以上前面的字符

13_26.png.jpg

grep 不同的是,egrep這里是使用’+’

b. 篩選零個或一個前面的字符

13_27.png.jpg

c. 篩選字符串1或者字符串2

13_28.png.jpg

中間有一個’|’表示或者的意思,筆者用這個用的很多,所以這個你最好記一下。

d. egrep’( )’的應(yīng)用

13_29.png.jpg

’( )’表示一個整體,例如(oo)+就表示1’oo’或者多個’oo’

13_44.png.jpg

sed 工具的使用

grep 工具的功能其實(shí)還不夠強(qiáng)大,其實(shí)說白了,grep實(shí)現(xiàn)的只是查找功能,而它卻不能實(shí)現(xiàn)把查找的內(nèi)容替換掉。以前用vim的時候,可以查找也可以替換,但是只局限于在文本內(nèi)部來操作,而不能輸出到屏幕上。sed工具以及下面要講的awk工具就能實(shí)現(xiàn)把替換的文本輸出到屏幕上的功能了,而且還有其他更豐富的功能。sedawk都是流式編輯器,是針對文檔的行來操作的。

a. 打印某行 sed -n ‘n’p filename 單引號內(nèi)的n是一個數(shù)字,表示第幾行

13_45.png.jpg

b. 打印多行打印整個文檔用 -n ‘1,$’p

13_46.png.jpg

c. 打印包含某個字符串的行

13_47.png.jpg

上面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同樣也能在sed中使用。

13_48.png.jpg

13_49.png.jpg

d. -e 可以實(shí)現(xiàn)多個行為

13_50.png.jpg

e. 刪除某行或者多行

13_51.png.jpg

‘d’ 這個字符就是刪除的動作了,不僅可以刪除指定的單行以及多行,而且還可以刪除匹配某個字符的行,另外還可以刪除從某一行一直到文檔末行

13_52.png.jpg

f. 替換字符或字符串

13_53.png.jpg

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號