如何使用 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
發佈留言