首頁 > 軟體

Linux行處理工具之grep 正規表示式詳解

2022-08-09 22:02:09

之前我們學習了linux grep的基本操作,以及提及了linux grep的孿生兄弟egrep 和 fgrep,這次我們來看下。

在介紹正規表示式之前,我們先來嘗試一下,假如有如下文字。

我們想獲取空行,應該如何來寫呢?

命令:

grep ^$ test1 -n

通過上述例子,我們使用正規表示式^$已經成功拿到了第四行資料,那麼,這究竟如何解呢,我們細看博文。

正規表示式在grep應用以及差別

grep表示式有三種不同的版本,分別為basic(BRE) 、extendedERE) 以及 perl(PCRE) ,我們grep預設支援的是BRE,而EREegrep支援的,或者說是grep -E支援的, 而PCRE則是grep -P支援的,那麼這三者究竟有啥區別呢?

 BREEREPCRE
任意字元...
前一個字元0次或者出現1次???
前一個字元出現0次或無數次***
前一個字元出現一個或者更多+++
字元集[...][...][...]
字元集取反[^...][^...][^...]
匹配前面字元出現的n次{n}{n}{n}
匹配前面字元出現的n次以上{n,}{n,}{n,}
匹配前面字元出現的n次到m次{n,m}{n,m}{n,m}
開頭
結尾$$$
多表示式連線|    
單詞www 或者 [[:word:]]
字母大寫/小寫[[:upper:]]/[[:lower:]][[:upper:]]/[[:lower:]][[:upper:]]/[[:lower:]]
非單詞  W
空白字元s 或者 [[:space:]]s 或者 [[:space:]] 
非空白字元[^[:space:]][^[:space:]]S
數位d 或者 [[:digit:]][[:digit:]][[:digit:]]
非數位D[^[:digit:]][^[:digit:]]

那麼如何進行切換呢? 如上面所示,我們來看下。

如上所述,若我們需要連線多個匹配項,在BRE(grep)中則是|,而在ERE(egrep)PCRE(grep -P)中則是|,所以我們可以順利獲取出結果,更多匹配項如上所述

匹配案例

匹配電話號碼

若電話號碼為xxx-xxxx-xxxx型別的,如何進行匹配呢? 我們可以使用'[0-9]{3}-[0-9]{4}-[0-9]{4}'進行匹配。

例如:

命令:

echo "telphone: 180-1234-5678" | grep  '[0-9]{3}-[0-9]{4}-[0-9]{4}' -o

同樣的,該方法還可以用來匹配其ip地址,正則: [0-9]{0,3}.[0-9]{0,3}.[0-9]{0,3}.[0-9]{0,3}

匹配空行

若我們想匹配空行,則可以使用^$進行匹配,即: 開頭就是結尾。

例如:

如上命令,我們順利取出了 第3、5、6行資料

匹配所有字母

命令:

echo 'Ac123e23dddwQW21' | grep "[[:upper:]]|[[:lower:]]" -o

取出redis在使用的組態檔

我們知道redis伺服器是以#來註釋的,我們可以利用grep或者egrep來過濾掉註釋和空格,例如:

fgrep

fgrep最為簡單,它不會啟用正規表示式,而是按照字元來進行搜尋,什麼意思呢? 我們舉個小案例就清楚了,

它不會進行任何正則匹配,所以可以直接使用搜尋選就成,不用考慮轉移啥的。

總結

我們一般將BRE稱之為 基本正規表示式、ERE稱之為 擴充套件正規表示式 而 PCRE稱之為Perl相容的正規表示式,如上正規表示式不是grep工具所實現的,而是單獨的一套表示式,有很多語言在使用中,例如 sed預設正規表示式是 BRE, 而我們之前所學習的awk使用的正規表示式則是ERE,是不是感覺知識被串聯起來了呢,好巧,我也是,怎麼樣,快來動手試驗一下吧。

到此這篇關於Linux行處理工具之grep 正規表示式詳解的文章就介紹到這了,更多相關linux grep 正規表示式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com