Linux 下 grep 命令的正則表達式規範

使用單個字符串來描述、匹配一系列符合某個句法規則的字符串,這就是正則表達式。Linux 的 grep 命令是一種查找過濾工具,用於在文件中查找指定模式的字符串,其支持正則表達式。

通配符和正則表達式的區別

在談正則表達式以前,首先說一下通配符和正則表達式的區別,兩者容易混淆。曾經我把通配符認爲就是正則表達式,在本該使用統配符的地方意圖使用正則表達式,因爲沒能達到想要的結果,這才意識到不對勁。通配符通常用於linux的shell命令中,例如: linux

grep hello *

這表示在當前目錄下的全部文件中查找含「hello」字符串的文件的行。下面列出一些通配符的含義: git

  •     [a-z]或[12]:匹配方括號中指定範圍內的單個字符或方括號列出的其中一個字符。
  •     [!9]:不匹配方括號中所列字符或指定範圍內的單個字符。
  •     *:匹配0個字符或多個字符。
  •     ?:匹配任何單個字符,且不能爲空字符。

正則表達式分類

一、基本的正則表達式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)

二、擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)

三、Perl 的正則表達式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)

其實咱們在大多數高級編程語言中所使用的正則表達式都源自Perl。實際上,正則表達式從Perl衍生出一個顯赫的流派,叫作PCRE(Perl Compatible Regular Expression)。其餘高級語言大多基於此修改或者擴展。而 Unix/Linux 下的工具大多采用POSIX規範,同時,POSIX規範又可分爲兩種流派,即 BREs 和 EREs。


正則表達式 Extended 規範

一、字符類

.   匹配任意一個字符
[]  匹配括號中的任意一個字符
\-  用在[]中,表示字符範圍
^   若是位於[]的開頭,則匹配除去括號中字符以外的一切字符
[[:xxx:]]   grep 工具預約義的一些命名字符類,例如 [[:alpha:]] 匹配一個字母,[[:digit:]] 匹配一個數字

二、數量限定符

?   緊跟在它前面的單元匹配零次或一次
\+  緊跟在它前面的單元匹配一次或屢次
\*  緊跟在它前面的單元匹配零次或屢次
{N}     緊跟在它前面的單元應精確匹配N次  [1-9][0-9]{2} 匹配從100 到999 的整數
{N,}    緊跟在它前面的單元至少要匹配n次
{,M}    緊跟在它前面的單元至多匹配m次
{N,M}   緊跟在它前面的單元至少匹配n次,至多匹配m次

三、位置限定符

^   匹配行首的位置
$   匹配行末的位置
\<   匹配單詞開頭的位置
\>   匹配單詞結尾的位置
\b  匹配單詞開頭或結尾的位置
\B  匹配非單詞開頭和結尾的位置

四、其餘特殊字符

\   轉義字符,普通字符轉義爲特殊字符,特殊字符轉義爲普通字符
()  將正則表達式的一部分括起來組成一個單元,能夠對整個單元使用數量限定符
|   鏈接兩個表達式,表示或的關係

以上介紹的是grep正則表達式的 Extended 規範,Basic 規範也有這些語法,只是字符 ?+{}|() 應解釋爲普通字符,要表示上述特殊含義則須要加 \ 轉義。若是用 grep 而不是 egrep,而且不加 -E 參數,則應該遵守Basic 規範來寫正則表達式。固然,若是是 grep -F,則只搜索固定字符串而不搜索正則表達式模式,不會按正則表達式語法解析後邊的參數,grep -F 等價於 fgrep。

最後須要強調的一點是,grep 找的是包含某一模式的行,而不是徹底匹配某一模式的行。也就是說,grep 的正則表達式匹配是以行爲單位的。 正則表達式


一些示例

搜索以小寫字母開頭的行

grep -n '^[a-z]' temp.txt

-n 參數表示輸出時顯示匹配的行號 shell

搜索開頭不是英文字母的行

grep -n '^[^a-zA-Z]' temp.txt

搜索空行

grep -n '^$' temp.txt

搜索以 g 開頭和結尾的字符串在的行

grep -n 'g.*g' temp.txt

搜索g開頭和結尾,中間是至少一個o的字符串

grep -n 'goo*g' temp.txt
相關文章
相關標籤/搜索