對多個字串使用 Grep

Niraj Menon 2022年5月11日 Linux Linux Grep
對多個字串使用 Grep

作為 Bash 指令碼編寫者,你可能會發現自己需要解析大量文字以獲取相關資訊。有時該資訊是無序的,這需要你找出一種模式來捕獲所有相關資料。

在 Linux 中完成這項工作的最佳工具是由 Ken Thompson 在 1973 年左右編寫的 grepgrep 適用於所有現代 UNIX 系統。

本教程將廣泛涵蓋 grep 的使用,從基本示例(例如捕獲單個短語到使用正規表示式或固定字串捕獲多個模式,假設使用 Bash 命令列)。

使用 grep 捕獲簡單的短語

使用 grep 的最簡單方法是查詢檔案中出現的短語。給定一個目標詞和一個檔案,我們可以在檔案中搜尋該詞,如圖所示。

user@linux:~$ cat file.txt
UNIX
tutorial
word
words
sword
tests
Linux

user@linux:~$ grep word file.txt
word
words
sword

正如你在上面看到的,所有包含子字串 word 的單詞都被捕獲。

你還可以捕獲程式的輸出並 grep 短語的輸出,如圖所示。我們將繼續使用該檔案作為示例,但你可以使用任何列印到 stdout 的程式來執行此操作。

user@linux:~$ cat file.txt | grep word
word
words
sword

如果你希望 grep 僅列印完全匹配的短語(即,它們周圍有空格並且不是其他單詞的子字串),你可以使用 -w/--word-regexp 標誌來啟用整體詞匹配。

如果短語顯示為單行,你可以使用相同的想法來匹配短語,使用 -x/--line-regexp

user@linux:~$ cat file.txt | grep -w word
word

帶有多個字串的 grep

要使用由換行符分隔的多個短語來捕獲來自程式的檔案或文字流中的相關匹配,你可以使用 -F/--fixed-strings 來指定它們。

你可以傳入一個如下所示的字串來代替少量匹配,用美元符號表示換行符。

grep -F "words$word" file.txt
# or
fgrep "words$word" file.txt

對於檔案中的更大列表,你可以使用 cat 將檔案列印為 grep 的引數並重用相同的語法。

user@linux:~$ cat match.txt
word
sword
user@linux:~$ fgrep "$(cat match.txt)" file.txt
word
words
sword

grep 與正規表示式

如果你熟悉 RegEx,本節將非常方便。使用 -E/--extended-regexp,你可以指定一個正規表示式模式來捕獲更復雜的短語,這些短語不能用單個或多個短語來捕捉。

給定一個隨機包含電子郵件地址和 URL 的檔案,我們可能希望通過單獨呼叫 grep 命令過濾掉與電子郵件或 URL 匹配的行。

用於捕獲電子郵件的一個簡單的、主要是幼稚的 RegEx 模式是 [^\@]+\@[^\.]+.*。要將其與 grep 一起使用,你可以執行以下操作:

user@linux:~$ cat file.txt 
user@linux.com
linux@torvalds.com
not a URL or email
https://www.google.com/
https://apple.com/
not an email or URL
user@linux:~$ egrep '[^\@]+\@[^\.]+.*' file.txt
user@linux.com
linux@torvalds.com

另一個利用 RegEx 的示例是指定多個模式以檢視它們中的每一個是否都存在於檔案中。為此,我們有以下模式。

請注意以下示例中使用的兩種 RegEx 模式之間的比較 - 一種使用 OR 運算子,另一種是這樣編寫的,該行必須包含所有三個單詞。

user@linux:~$ cat file.txt
apple banana grape
bus lamppost bench
apple bench grape
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P 'apple|banana|grape' file.txt
apple banana grape
apple bench grape
banana grape apple
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P '^(?=.*apple)(?=.*banana)(?=.*grape)' file.txt
apple banana grape
banana grape apple

請記住,grep 並不是 UNIX 系統中唯一可用的字串匹配工具。你也可以使用 awk 來捕捉複雜的模式。你還可以使用 sed 根據匹配條件替換短語。

本教程從 grep 手冊頁獲取資訊,你可以通過在任何 UNIX 終端或此頁上鍵入 man grep 來訪問該手冊頁。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe

相關文章 - Linux Grep