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”選項實現。

[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”字符串爲行首的行,則可以通過“^”元字符來實現。

[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編程之正則表達式(一)基礎正則表達式
查找任意一個字符“.”與重複字符“*”

[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編程之正則表達式(一)基礎正則表達式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章