如何使用 grep 排除模式、文件和目錄

如何使用 grep 排除模式、文件和目錄

自 1974 年以來,Linux 團隊一直在grep幫助人們在文件中查找行。但有時grep太小心了。這裡有一些方法可以說grep忽略不同的事情。

grep 命令

該命令在grep文本文件中搜索與命令行中指定的搜索模式匹配的行。強大grep之處在於使用正則表達式。它們允許您描述您正在尋找的內容,而不是明確定義它。

誕生grep早於 Linux。它是在 1970 年代初為 Unix 開發的。它的名字來自ed行編輯器中的 g/re/p 鍵序列(順便說一下,發音為“ee-dee”)。這意味著全局、正則快速搜索、打印匹配行。

grep眾所周知——也許是臭名昭著的——因為他是徹底的和專一的。有時它會查找您不想浪費時間的文件或目錄,因為結果可能使您無法只見樹木不見森林。

當然,也有控制 grep 的方法。您可以告訴它忽略模式、文件和目錄,以便 grep 搜索更快,並且您不會被無意義的誤報淹沒。

模式排除

要進行搜索,grep您可以從其他進程直接輸入,例如cat,或者您可以指定文件名作為最後一個命令行參數。

我們正在使用一個包含Lewis Carroll的詩歌Jabberwocky文本的短文件  。在這兩個示例中,我們正在尋找與搜索詞“jabberwock”匹配的字符串。

cat jabberwocky.txt | grep "Jabberwock"grep "Jabberwock"jabberwocky.text

為我們列出了包含帶有搜索提示的匹配項的行,每行中的相應項目以紅色突出顯示。這是直接搜索。但是如果我們想排除包含“Jabberwock”這個詞的行並打印其餘的行怎麼辦?

-v我們可以使用(invert match) 選項來實現這一點。這列出了與搜索查詢不匹配的字符串。

grep -v "Jabberwock"jabberwocky.text

不包含“Jabmaglot”的行將顯示在終端窗口中。

我們可以根據需要排除盡可能多的術語。讓我們過濾掉所有包含“Jabberwock”的行和所有包含“and”的行。為此,我們將使用一個-e選項(表達式)。我們需要將它用於我們使用的每個搜索模式。

grep -v -e "Jabberwock"-e "and"jabberwocky.txt

輸出中的行數相應減少。

如果我們使用-E選項(擴展正則表達式),我們可以將搜索模式與“ |”結合起來,在這種情況下,它不表示通道,它是一個邏輯OR運算符。

grep -Ev "Jabberwock|and"jabberwocky.txt

我們得到與前面更長的命令完全相同的輸出。

如果您想使用正則表達式模式而不是顯式搜索提示,則命令格式相同。此命令將排除以“ACHT”集中任何字母開頭的所有行。

grep -Ev "^ACHT"jabberwocky.txt

要查看包含一個模式但不包含另一個模式的行,我們可以傳入grep. grep我們將搜索所有包含單詞“jabberwock”的行,然後過濾掉所有包含單詞“killed”的行。

grep "Jabberwock"jabberwocky.txt | grep -v "slain"

文件排除

我們可以要求grep在一組文件中搜索字符串或模式。您可以在命令行上列出每個文件,但是對於許多文件,這種方法無法擴展。

grep "vorpal"verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt

請注意,包含匹配行的文件名出現在每行輸出的開頭。

為了縮短輸入,我們可以使用通配符。但這可能違反直覺。它似乎工作。

grep "vorpal"*.txt

但是,這個目錄下還有其他與這首詩無關的TXT文件。如果我們用相同的命令結構搜索“劍”這個詞,我們會得到很多誤報。

grep "sword"*.txt

我們需要的結果被來自其他 TXT 文件的一系列錯誤結果所掩蓋。

“vorpal”這個詞沒有對應任何東西,但是“sword”這個詞包含在“password”這個詞中,所以在一些偽日誌文件中多次出現。

我們需要排除這些文件。為此,我們使用該--exclude選項。要排除一個名為“vol-log-1.txt”的文件,我們將使用以下命令:

grep --exclude=vol-log-1.txt "sword"*.txt

在這種情況下,我們要排除多個名稱以“vol”開頭的日誌文件。我們需要的語法是:

grep --exclude=vol*.txt "sword"*.txt

當我們使用-R(dereference-recursive) 選項時,grep它將為我們搜索所有目錄樹。默認情況下,它將查找這些位置中的所有文件。我們可能想要排除幾種類型的文件。

在這台測試機的當前目錄下,有​​包含日誌文件、CSV文件和MD文件的子目錄。這些是我們要排除的所有類型的文本文件。我們可以--exclude為每種文件類型使用一個參數,但是我們可以通過對文件類型進行分組來更有效地實現我們想要的。

此命令排除所有擴展名為 .csv 或 .md 的文件,以及名稱以“vol”或“log”開頭的所有 .txt 文件。

grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword"/home/dave/data/

排除目錄

如果我們要忽略的文件包含在目錄中,而這些目錄不包含我們要查找的文件,我們可以完全排除這些目錄。

這個概念與排除文件非常相似,只是我們使用了一個--exclude-dir參數並命名了要忽略的目錄。

grep -R --exclude-dir=backup "vorpal"/home/dave/data

我們已經排除了“backup”目錄,但仍在尋找另一個名為“backup2”的目錄。

毫不奇怪,我們可以--exclude-dir在同一個命令中多次使用這個選項。請注意,排除目錄的路徑必須相對於搜索開始的目錄。不要使用來自文件系統根目錄的絕對路徑。

grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal"/home/dave/data

我們也可以使用分組。我們可以更簡潔地實現相同的結果:

grep -R --exclude-dir={backup,backup2} "vorpal"/home/dave/data

您可以在一個命令中組合文件和目錄排除項。如果要從目錄中排除所有文件並從搜索目錄中排除某些類型的文件,請使用以下語法:

grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious"/home/dave/data

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *