shell編程之正則表達式(一)基礎正則表達式

正則表達式
以前學習了 Shell 腳本的基礎用法,已經能夠利用條件判斷、循環等語句編輯 Shell 腳本。接下來咱們將開始介紹一個很重要的概念——正則表達式(RegularExpression,RE)。
正則表達式的定義
正則表達式又稱正規表達式、常規表達式。在代碼中常簡寫爲 regex、regexp 或 RE。正則表達式是使用單個字符串來描述、匹配一系列符合某個句法規則的字符串,簡單來講, 是一種匹配字符串的方法,經過一些特殊符號,實現快速查找、刪除、替換某個特定字符串。
正則表達式是由普通字符與元字符組成的文字模式。模式用於描述在搜索文本時要匹配的一個或多個字符串。正則表達式做爲一個模板,將某個字符模式與所搜索的字符串進行匹配。其中普通字符包括大小寫字母、數字、標點符號及一些其餘符號,元字符則是指那些在正則表達式中具備特殊意義的專用字符,能夠用來規定其前導字符(即位於元字符前面的字符)在目標對象中的出現模式。
正則表達式通常用於腳本編程與文本編輯器中。不少文本處理器與程序設計語言均支持正則表達式,如前面提到的 Perl、Linux 系統中常見的文本處理器(grep、egrep、sed、awk)。正則表達式具有很強大的文本匹配功能,可以在文本海洋中快速高效地處理文本。
正則表達式用途
對於通常計算機用戶來講,因爲使用到正則表達式的機會很少,因此沒法體會正則表達式的魅力,而對於系統管理員來講,正則表達式則是必備技能之一。
正則表達式對於系統管理員來講是很是重要的,系統運行過程當中會產生大量的信息,這些信息有些是很是重要的,有些則僅是告知的信息。身爲系統管理員若是直接看這麼多的信息數據,沒法快速定位到重要的信息,如「用戶帳號登陸失敗」「服務啓動失敗」等信息。這時能夠經過正則表達式快速提取「有問題」的信息。如此一來,能夠將運維工做變得更加簡單、方便。
目前不少軟件也支持正則表達式,最多見的就是郵件服務器。在 Internet 中,垃圾/廣告郵件常常會形成網絡塞車,若是在服務器端就將這些問題郵件提早剔除的話,客戶端就會減小不少沒必要要的帶寬消耗。而目前經常使用的郵件服務器 postfix 以及支持郵件服務器的相關分析軟件都支持正則表達式的比對功能。未來信的標題和內容與特殊字符串進行對比,發現問題郵件就過濾掉。
除郵件服務器以外,不少服務器軟件都支持正則表達式。雖然這些軟件都支持正則表達式,不過字符串的對比規則還須要系統管理員來添加,因此做爲系統管理員,正則表達式是必須掌握的技能之一。
基礎正則表達式
正則表達式的字符串表達方法根據不一樣的嚴謹程度與功能分爲基本正則表達式與擴展正則表達式。基礎正則表達式是經常使用的正則表達式的最基礎的部分。在 Linux 系統中常見的文件處理工具中 grep 與 sed 支持基礎正則表達式,而 egrep 與 awk 支持擴展正則表達式。掌握基礎正則表達式的使用方法,首先必須瞭解基本正則表達式所包含的元字符的含義,下面經過 grep 命令以舉例的方式逐個介紹。
基礎正則表達式示例:
查找特定字符很是簡單,如執行如下命令便可從 test.txt 文件中查找出特定字符「the」 所在位置。其中「-n」表示顯示行號、「-i」表示不區分大小寫。命令執行後,符合匹配標準的字符,字體顏色會變爲紅色(本章中所有經過加粗顯示代替)。
查找特定字符正則表達式

[root@localhost ~]# grep -n 'the' test.txt

shell編程之正則表達式(一)基礎正則表達式

[root@localhost ~]# grep -in 'the' test.txt

shell編程之正則表達式(一)基礎正則表達式
若反向選擇,如查找不包含「the」字符的行,則須要經過 grep 命令的「-vn」選項實現。shell

[root@localhost ~]# grep -vn 'the' test.txt

shell編程之正則表達式(一)基礎正則表達式
利用中括號「[]」來查找集合字符
想要查找「shirt」與「short」這兩個字符串時,能夠發現這兩個字符串均包含「sh」 與「rt」。此時執行如下命令便可同時查找到「shirt」與「short」這兩個字符串。「[]」中不管有幾個字符,都僅表明一個字符,也就是說「[io]」表示匹配「i」或者「o」。編程

[root@localhost ~]# grep -n 'sh[io]rt' test.txt

shell編程之正則表達式(一)基礎正則表達式
若要查找包含重複單個字符「oo」時,只須要執行如下命令便可。服務器

[root@localhost ~]# grep -n 'oo' test.txt

shell編程之正則表達式(一)基礎正則表達式
若查找「oo」前面不是「w」的字符串,只須要經過集合字符的反向選擇「[^]」來實現該目的,如執行「grep –n‘[^w]oo’test.txt」命令表示在 test.txt 文本中查找「oo」 前面不是「w」的字符串。網絡

[root@localhost ~]# grep -n '[^w]oo' test.txt

shell編程之正則表達式(一)基礎正則表達式
在上述命令的執行結果中發現「woood」與「wooooood」也符合匹配規則,兩者均包含「w」。其實經過執行結果就能夠看出,符合匹配標準的字符加粗顯示,而上述結果中能夠得知,「#woood #」中加粗顯示的是「ooo」,而「oo」前面的「o」是符合匹配規則的。同理 「#woooooood #」也符合匹配規則。
若不但願「oo」前面存在小寫字母,可使用「grep –n‘[^a-z]oo’test.txt」命令實現,其中「a-z」表示小寫字母,大寫字母則經過「A-Z」表示。運維

[root@localhost ~]# grep -n '[^a-z]oo' test.txt

shell編程之正則表達式(一)基礎正則表達式

[root@localhost ~]# grep -n '[^a-zA-Z]oo' test.txt

過濾以a-z,A-Z開頭的字符串
查找包含數字的行能夠經過「grep –n‘[0-9]’test.txt」命令來實現。編輯器

[root@localhost ~]# grep -n '[0-9]' test.txt

shell編程之正則表達式(一)基礎正則表達式
查找行首「^」與行尾字符「$」
基礎正則表達式包含兩個定位元字符:「^」(行首)與「$」(行尾)。在上面的示例中,查詢「the」字符串時出現了不少包含「the」的行,若是想要查詢以「the」字符串爲行首的行,則能夠經過「^」元字符來實現。ide

[root@localhost ~]# grep -n '^the' test.txt

shell編程之正則表達式(一)基礎正則表達式

[root@localhost ~]# grep -n '\.$‘’ test.txt

shell編程之正則表達式(一)基礎正則表達式
當查詢空白行時,執行「grep –n‘^$’test.txt」命令便可。工具

[root@localhost ~]# grep -n '^$' test.txt

shell編程之正則表達式(一)基礎正則表達式
查找任意一個字符「.」與重複字符「*」post

[root@localhost ~]# grep -n 'w..d' test.txt

shell編程之正則表達式(一)基礎正則表達式
」表明的是重複零個或多個前面的單字符。「o」表示擁有零個(即爲空字符)或大於等於一個「o」的字符,由於容許空字符,因此執行「grep –n‘o’test.txt」命令會將文本中全部的內容都輸出打印。若是是「oo」, 則第一個 o 必須存在,第二個 o 則是零個或多個 o,因此凡是包含 o、oo、ooo、ooo,等的資料都符合標準。同理,若查詢包含至少兩個 o 以上的字符串,則執行「grep –n‘ooo*’ test.txt」命令便可。

[root@localhost ~]# grep -n 'ooo*' test.txt

shell編程之正則表達式(一)基礎正則表達式
查詢以 w 開頭 d 結尾,中間包含至少一個 o 的字符串,執行如下命令便可實現。

[root@localhost ~]# grep -n 'woo*d' test.txt

shell編程之正則表達式(一)基礎正則表達式
查詢以 w 開頭 d 結尾,中間的字符無關緊要的字符串。

[root@localhost ~]# grep -n 'w.*d' test.txt

shell編程之正則表達式(一)基礎正則表達式
查詢任意數字所在行

[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt

shell編程之正則表達式(一)基礎正則表達式
查找連續字符範圍「{}」
在上面的示例中,咱們使用「.」與「*」來設定零個到無限多個重複的字符,若是想要限制一個範圍內的重複的字符串該如何實現呢?例如,查找三到五個 o 的連續字符,這個時候就須要使用基礎正則表達式中的限定範圍的字符「{}」。由於「{}」在 Shell 中具備特殊 意義,因此在使用「{}」字符時,須要利用轉義字符「\」,將「{}」字符轉換成普通字符。 「{}」字符的使用方法以下所示。
查詢兩個 o 的字符:

[root@localhost ~]# grep -n 'o\{2\}' test.txt

shell編程之正則表達式(一)基礎正則表達式
查詢以 w 開頭以 d 結尾,中間包含 2~5 個 o 的字符串

[root@localhost ~]# grep -n 'wo\{2,5\}d' test.txt

shell編程之正則表達式(一)基礎正則表達式
查詢以 w 開頭以 d 結尾,中間包含 2 以上 o 的字符串

[root@localhost ~]# grep -n 'wo\{2,\}d' test.txt

shell編程之正則表達式(一)基礎正則表達式
元字符總結
shell編程之正則表達式(一)基礎正則表達式
擴展正則表達式
一般狀況下會使用基礎正則表達式就已經足夠了,但有時爲了簡化整個指令,須要使用範圍更廣的擴展正則表達式。例如,使用基礎正則表達式查詢除文件中空白行與行首爲「#」 以外的行(一般用於查看生效的配置文件),執行「grep –v‘^$’test.txt | grep –v ‘^#’」便可實現。這裏須要使用管道命令來搜索兩次。若是使用擴展正則表達式,能夠簡化爲「egrep –v‘^$|^#’test.txt」,其中,單引號內的管道符號表示或者(or)。
此外,grep 命令僅支持基礎正則表達式,若是使用擴展正則表達式,須要使用 egrep 或 awk 命令。awk 命令在後面的小節進行講解,這裏咱們直接使用 egrep 命令。egrep 命令與 grep 命令的用法基本類似。egrep 命令是一個搜索文件得到模式,使用該命令能夠搜索文件中的任意字符串和符號,也能夠搜索一個或多個文件的字符串,一個提示符能夠是單個字符、一個字符串、一個字或一個句子。
與基礎正則表達式類型相同,擴展正則表達式也包含多個元字符,常見的擴展正則表達
式的元字符主要包括如下幾個
shell編程之正則表達式(一)基礎正則表達式

相關文章
相關標籤/搜索