號稱“天書”的正則表達式,要這麼來講,我小學三年級已經滿分了

引言

grep是Linux中用於文件處理的最有用和最強大的命令之一。

grep在一個或多個輸入文件中搜索與正則表達式匹配的行,並將每個匹配的行寫入標準輸出。

在本文中,我們將探索如何在grep的GNU版本中使用正則表達式的基礎知識,該版本在大多數Linux操作系統中默認可用。

號稱“天書”的正則表達式,要這麼來講,我小學三年級已經滿分了

grep的正則表達式

正則表達式(regex)是與一組字符串匹配的模式。模式由操作符、構造文字字符和元字符組成,它們具有特殊的含義。

GNU grep 支持三種正則表達式語法:Basic、Extended和Perl兼容。

在其最簡單的形式中,當沒有給定正則表達式類型時,grep將搜索模式解釋為基本正則表達式。

要將模式解釋為擴展正則表達式,請使用-E(或--tended-regexp)選項。

在GNU的grep實現中,基本正則表達式語法和擴展正則表達式語法之間沒有功能差異。唯一的區別是,在基本正則表達式中,元字符?、+、{、|、(和)被解釋為文字字符。

要在使用基本正則表達式時保留元字符的特殊含義,必須使用反斜槓(\\)對字符進行轉義。我們稍後將解釋這些元字符和其他元字符的含義。

通常,你應該

始終用單引號將正則表達式括起來,以避免shell解釋和擴展元字符。


文本匹配

grep命令最基本的用法是在文件中搜索文字字符或字符序列。

例如,要顯示/etc/passwd文件中包含字符串“bash”的所有行,你可以運行以下命令:

<code>grep bash /etc/passwd/<code>

輸出內容如下:

<code>root:x:0:0:root:/root:/bin/bash
coder:x:1000:1000:coder:/home/coder:/bin/bash/<code>

在本例中,字符串“bash”是一個基本的正則表達式,由四個文字字符組成。這告訴grep搜索“b”緊跟“a”、“s”和“h”的字符串。

默認情況下,grep命令區分大小寫。這意味著大寫和小寫字符被視為不同字符。要在搜索時忽略大小寫,請使用-i選項(或--Ignore-case)。

需要注意的是,grep將搜索模式作為字符串而不是單詞進行查找。因此,如果你要搜索“gnu”,grep還會打印“gnu”嵌入較大單詞的行,例如“cygnus”或“magum”。

如果搜索字符串包含空格,則需要用單引號或雙引號將其引起來:

<code>grep "FTP User" /etc/passwd/<code>


錨點

錨點是元字符,允許您指定必須在行中的什麼位置找到匹配項。^(脫字符)與行首的空字符串匹配。

在下面的示例中,字符串“linux”只有在行首出現時才會匹配。

<code>grep '^linux' file.txt/<code>

$(dollar)符號與行首的空字符串匹配。要查找以字符串“linux”結尾的行,你可以使用:

<code>grep 'linux$' file.txt/<code>

你還可以使用這兩個錨點構造正則表達式。例如,要查找僅包含“linux”的行,請運行:

<code>grep '^linux$' file.txt/<code>

如果用拍匹配空白行,可以使用“^$”模式。


匹配單個字符

那個.(英文句號)符號是匹配任何單個字符的元字符。

例如,要匹配以“kan”開頭、然後有兩個字符、以字符串“roo”結尾的任何內容,可以使用以下模式:

<code>grep 'kan..roo' file.txt/<code>

這樣可以匹配出含有 kangaroo 的行。


方括號表達式

方括號表達式允許通過將一組字符括在方括號[]中來匹配它們。例如,查找包含“accept”或“accent”的行,可以使用以下表達式:

<code>grep 'acce[np]t' file.txt/<code>

如果方括號內的第一個字符是脫字符^,則它匹配方括號中未括起的任何單個字符。

以下模式將匹配以“co”開頭、後跟除“l”和“la”之外的任何字母的任意字符串組合,如“coca”、“cobalt”等,但不匹配包含“cola”的行:

<code>grep 'co[^l]a' file.txt/<code>

你可以在方括號內指定一個字符範圍,而不是逐個放置字符。

範圍表達式是通過指定用連字符分隔的範圍的第一個和最後一個字符來構造的。例如,[a-a]相當於[abcde],[1-3]相當於[123]。

以下表達式匹配以大寫字母開頭的每一行:

<code>grep '^[A-Z]' file.txt/<code>

grep還支持用括號括起來的預定義字符類。下表顯示了一些最常見的字符類:

  • [:alnum:] 字母數字字符。
  • [:alpha:] 字母字符。
  • [:blank:] 空格和製表符。
  • [:digit:] 數字。
  • [:lower:] 小寫字母。
  • [:upper:] 大寫字母。

完全的量詞表可參考 man grep 手冊。


量詞

量詞允許你指定匹配必須出現的項的出現次數。下表顯示了GNU grep支持的限定符:

  • * 匹配前面的條目零次或多次。
  • ? 匹配前面的條目零次或一次。
  • + 匹配前面的條目一次或多次。
  • {n} 與前面的條目正好匹配n次。
  • {n,} 至少匹配前面的條目n次。
  • {,m} 最多匹配前面的條目m次。
  • {n,m} 匹配前面的條目n到m次。

*(星號)字符與前面的項目匹配零次或多次。以下內容將與“right”、“sright”、“ssright”等匹配:

<code>grep 's*right'/<code>

下面是更高級的模式,它匹配以大寫字母開頭、以句點或逗號結束的所有行。

.*正則表達式匹配任意數量的任意字符:

<code>grep -E '^[A-Z].*[.,]$' file.txt/<code>

?(問號)字符使前面的項目成為可選的,並且它只能匹配一次。下面的內容將同時匹配“bight”和“right”。

?字符使用反斜槓進行轉義,因為我們使用的是基本正則表達式:

<code>grep 'b\\?right' file.txt/<code>

下面是使用擴展正則表達式的相同正則表達式:

<code>grep -E 'b?right' file.txt/<code>

+(加號)字符與前面的項目匹配一次或多次。下面將匹配“sright”和“ssright”,但不匹配“right”:

<code>grep -E 's+right' file.txt/<code>

大括號字符{}允許你指定匹配必須出現的確切數量、上限或下限或範圍。

以下內容匹配3到9位之間的所有整數

<code>grep -E '[[:digit:]]{3,9}' file.txt/<code>


交替

術語交替是一個簡單的“或”。交替運算符|(豎線)允許你指定不同可能的匹配項,這些匹配項可以是文字字符串或表達式集。此運算符在所有正則表達式運算符中優先級最低。

在下面的示例中,我們將在Nginx日誌錯誤文件中搜索單詞fatal、error和critical的所有匹配項:

<code>grep 'fatal\\|error\\|critical' /var/log/nginx/error.log/<code>

如果使用擴展正則表達式,則不應轉義運算符|,如下所示:

<code>grep -E 'fatal|error|critical' /var/log/nginx/error.log/<code>


分組

分組是正則表達式的一項功能,它允許將模式分組在一起,並將它們作為一個項目引用。組是使用括號()創建的。使用基本正則表達式時,括號必須用反斜槓(\\)轉義。

下面的示例同時匹配“fearless”和“less”。?量詞使(fear)組成為可選的:

<code>grep -E '(fear)?less' file.txt/<code>


特殊轉義符

GNU grep包括幾個元字符,這些元字符由一個反斜槓後跟一個常規字符組成。

下表展示了一些最常見的特殊反斜槓表達式:

  • \\b 匹配單詞邊界。
  • \\< 匹配單詞開頭的空字符串。
  • \\> 匹配單詞末尾的空字符串。
  • \\w 匹配一個單詞。
  • \\s 匹配空格。

下面的模式將匹配單獨的單詞“abject”和“object”。如果嵌入到較大的單詞中,它將與單詞不匹配:

<code>grep '\\b[ao]bject\\b' file.txt/<code>


寫在最後

正則表達式用於文本編輯器、編程語言和命令行工具,如grep、sed和awk。

在搜索文本文件、編寫腳本或篩選命令輸出時,瞭解如何構造正則表達式非常有用。


分享到:


相關文章: