您好,登錄后才能下訂單哦!
正則表達式
之前學習了 Shell 腳本的基礎用法,已經(jīng)可以利用條件判斷、循環(huán)等語句編輯 Shell 腳本。接下來我們將開始介紹一個很重要的概念——正則表達式(RegularExpression,RE)。
正則表達式的定義
正則表達式又稱正規(guī)表達式、常規(guī)表達式。在代碼中常簡寫為 regex、regexp 或 RE。正則表達式是使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串,簡單來說, 是一種匹配字符串的方法,通過一些特殊符號,實現(xiàn)快速查找、刪除、替換某個特定字符串。
正則表達式是由普通字符與元字符組成的文字模式。模式用于描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。其中普通字符包括大小寫字母、數(shù)字、標點符號及一些其他符號,元字符則是指那些在正則表達式中具有特殊意義的專用字符,可以用來規(guī)定其前導字符(即位于元字符前面的字符)在目標對象中的出現(xiàn)模式。
正則表達式一般用于腳本編程與文本編輯器中。很多文本處理器與程序設計語言均支持正則表達式,如前面提到的 Perl、Linux 系統(tǒng)中常見的文本處理器(grep、egrep、sed、awk)。正則表達式具備很強大的文本匹配功能,能夠在文本海洋中快速高效地處理文本。
正則表達式用途
對于一般計算機用戶來說,由于使用到正則表達式的機會不多,所以無法體會正則表達式的魅力,而對于系統(tǒng)管理員來說,正則表達式則是必備技能之一。
正則表達式對于系統(tǒng)管理員來說是非常重要的,系統(tǒng)運行過程中會產(chǎn)生大量的信息,這些信息有些是非常重要的,有些則僅是告知的信息。身為系統(tǒng)管理員如果直接看這么多的信息數(shù)據(jù),無法快速定位到重要的信息,如“用戶賬號登錄失敗”“服務啟動失敗”等信息。這時可以通過正則表達式快速提取“有問題”的信息。如此一來,可以將運維工作變得更加簡單、方便。
目前很多軟件也支持正則表達式,最常見的就是郵件服務器。在 Internet 中,垃圾/廣告郵件經(jīng)常會造成網(wǎng)絡塞車,如果在服務器端就將這些問題郵件提前剔除的話,客戶端就會減少很多不必要的帶寬消耗。而目前常用的郵件服務器 postfix 以及支持郵件服務器的相關分析軟件都支持正則表達式的比對功能。將來信的標題和內(nèi)容與特殊字符串進行對比,發(fā)現(xiàn)問題郵件就過濾掉。
除郵件服務器之外,很多服務器軟件都支持正則表達式。雖然這些軟件都支持正則表達式,不過字符串的對比規(guī)則還需要系統(tǒng)管理員來添加,所以作為系統(tǒng)管理員,正則表達式是必須掌握的技能之一。
基礎正則表達式
正則表達式的字符串表達方法根據(jù)不同的嚴謹程度與功能分為基本正則表達式與擴展正則表達式。基礎正則表達式是常用的正則表達式的最基礎的部分。在 Linux 系統(tǒng)中常見的文件處理工具中 grep 與 sed 支持基礎正則表達式,而 egrep 與 awk 支持擴展正則表達式。掌握基礎正則表達式的使用方法,首先必須了解基本正則表達式所包含的元字符的含義,下面通過 grep 命令以舉例的方式逐個介紹。
基礎正則表達式示例:
查找特定字符非常簡單,如執(zhí)行以下命令即可從 test.txt 文件中查找出特定字符“the” 所在位置。其中“-n”表示顯示行號、“-i”表示不區(qū)分大小寫。命令執(zhí)行后,符合匹配標準的字符,字體顏色會變?yōu)榧t色(本章中全部通過加粗顯示代替)。
查找特定字符
[root@localhost ~]# grep -n 'the' test.txt
[root@localhost ~]# grep -in 'the' test.txt
若反向選擇,如查找不包含“the”字符的行,則需要通過 grep 命令的“-vn”選項實現(xiàn)。
[root@localhost ~]# grep -vn 'the' test.txt
利用中括號“[]”來查找集合字符
想要查找“shirt”與“short”這兩個字符串時,可以發(fā)現(xiàn)這兩個字符串均包含“sh” 與“rt”。此時執(zhí)行以下命令即可同時查找到“shirt”與“short”這兩個字符串?!癧]”中無論有幾個字符,都僅代表一個字符,也就是說“[io]”表示匹配“i”或者“o”。
[root@localhost ~]# grep -n 'sh[io]rt' test.txt
若要查找包含重復單個字符“oo”時,只需要執(zhí)行以下命令即可。
[root@localhost ~]# grep -n 'oo' test.txt
若查找“oo”前面不是“w”的字符串,只需要通過集合字符的反向選擇“[^]”來實現(xiàn)該目的,如執(zhí)行“grep –n‘[^w]oo’test.txt”命令表示在 test.txt 文本中查找“oo” 前面不是“w”的字符串。
[root@localhost ~]# grep -n '[^w]oo' test.txt
在上述命令的執(zhí)行結果中發(fā)現(xiàn)“woood”與“wooooood”也符合匹配規(guī)則,二者均包含“w”。其實通過執(zhí)行結果就可以看出,符合匹配標準的字符加粗顯示,而上述結果中可以得知,“#woood #”中加粗顯示的是“ooo”,而“oo”前面的“o”是符合匹配規(guī)則的。同理 “#woooooood #”也符合匹配規(guī)則。
若不希望“oo”前面存在小寫字母,可以使用“grep –n‘[^a-z]oo’test.txt”命令實現(xiàn),其中“a-z”表示小寫字母,大寫字母則通過“A-Z”表示。
[root@localhost ~]# grep -n '[^a-z]oo' test.txt
[root@localhost ~]# grep -n '[^a-zA-Z]oo' test.txt
過濾以a-z,A-Z開頭的字符串
查找包含數(shù)字的行可以通過“grep –n‘[0-9]’test.txt”命令來實現(xiàn)。
[root@localhost ~]# grep -n '[0-9]' test.txt
查找行首“^”與行尾字符“$”
基礎正則表達式包含兩個定位元字符:“^”(行首)與“$”(行尾)。在上面的示例中,查詢“the”字符串時出現(xiàn)了很多包含“the”的行,如果想要查詢以“the”字符串為行首的行,則可以通過“^”元字符來實現(xiàn)。
[root@localhost ~]# grep -n '^the' test.txt
[root@localhost ~]# grep -n '\.$‘’ test.txt
當查詢空白行時,執(zhí)行“grep –n‘^$’test.txt”命令即可。
[root@localhost ~]# grep -n '^$' test.txt
查找任意一個字符“.”與重復字符“*”
[root@localhost ~]# grep -n 'w..d' test.txt
“”代表的是重復零個或多個前面的單字符。“o”表示擁有零個(即為空字符)或大于等于一個“o”的字符,因為允許空字符,所以執(zhí)行“grep –n‘o’test.txt”命令會將文本中所有的內(nèi)容都輸出打印。如果是“oo”, 則第一個 o 必須存在,第二個 o 則是零個或多個 o,所以凡是包含 o、oo、ooo、ooo,等的資料都符合標準。同理,若查詢包含至少兩個 o 以上的字符串,則執(zhí)行“grep –n‘ooo*’ test.txt”命令即可。
[root@localhost ~]# grep -n 'ooo*' test.txt
查詢以 w 開頭 d 結尾,中間包含至少一個 o 的字符串,執(zhí)行以下命令即可實現(xiàn)。
[root@localhost ~]# grep -n 'woo*d' test.txt
查詢以 w 開頭 d 結尾,中間的字符可有可無的字符串。
[root@localhost ~]# grep -n 'w.*d' test.txt
查詢?nèi)我鈹?shù)字所在行
[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt
查找連續(xù)字符范圍“{}”
在上面的示例中,我們使用“.”與“*”來設定零個到無限多個重復的字符,如果想要限制一個范圍內(nèi)的重復的字符串該如何實現(xiàn)呢?例如,查找三到五個 o 的連續(xù)字符,這個時候就需要使用基礎正則表達式中的限定范圍的字符“{}”。因為“{}”在 Shell 中具有特殊 意義,所以在使用“{}”字符時,需要利用轉(zhuǎn)義字符“\”,將“{}”字符轉(zhuǎn)換成普通字符。 “{}”字符的使用方法如下所示。
查詢兩個 o 的字符:
[root@localhost ~]# grep -n 'o\{2\}' test.txt
查詢以 w 開頭以 d 結尾,中間包含 2~5 個 o 的字符串
[root@localhost ~]# grep -n 'wo\{2,5\}d' test.txt
查詢以 w 開頭以 d 結尾,中間包含 2 以上 o 的字符串
[root@localhost ~]# grep -n 'wo\{2,\}d' test.txt
元字符總結
擴展正則表達式
通常情況下會使用基礎正則表達式就已經(jīng)足夠了,但有時為了簡化整個指令,需要使用范圍更廣的擴展正則表達式。例如,使用基礎正則表達式查詢除文件中空白行與行首為“#” 之外的行(通常用于查看生效的配置文件),執(zhí)行“grep –v‘^$’test.txt | grep –v ‘^#’”即可實現(xiàn)。這里需要使用管道命令來搜索兩次。如果使用擴展正則表達式,可以簡化為“egrep –v‘^$|^#’test.txt”,其中,單引號內(nèi)的管道符號表示或者(or)。
此外,grep 命令僅支持基礎正則表達式,如果使用擴展正則表達式,需要使用 egrep 或 awk 命令。awk 命令在后面的小節(jié)進行講解,這里我們直接使用 egrep 命令。egrep 命令與 grep 命令的用法基本相似。egrep 命令是一個搜索文件獲得模式,使用該命令可以搜索文件中的任意字符串和符號,也可以搜索一個或多個文件的字符串,一個提示符可以是單個字符、一個字符串、一個字或一個句子。
與基礎正則表達式類型相同,擴展正則表達式也包含多個元字符,常見的擴展正則表達
式的元字符主要包括以下幾個
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。