Command-Line

用於查找內部文件的管道 grep

  • July 24, 2019

(從 ask-ubuntu 自行遷移,因為它與 linux 相關,不是 ubuntu,而且我的作業系統不是 ubuntu)

我正在嘗試製作一個看起來像這樣的 grep:

grep -r 2019 | grep -riv FAILED | grep -rl DSL

我想獲取-l包含其中的文件的文件名(),而2019不是(-v)包含FAILED和包含DSL

在這裡,只執行最後一個 grep。我知道這是因為-r, 所以每個 grep grep 對所有文件而不是以前的結果。但我無法弄清楚如何在沒有-r.

也許還有另一種在 grep 上使用多個模式的方法,但是對於“正”和“負”匹配,我沒有找到任何東西。

管道中的最後一個grep將從前一個讀取grep(如果它沒有使用該-r選項,請參見後面),因此它不知道數據來自哪個文件,這反過來意味著它無法報告路徑名的文件。

相反,考慮find像這樣使用:

find . -type f \
   -exec grep -q 2019 {} \; \
   -exec grep -q DSL {} \; \
   ! -exec grep -qi FAILED {} \; \
   -print

這將從目前目錄和任何子目錄(遞歸地)獲取每個正常文件,並測試它是否包含字元串2019DSLFAILED(不區分大小寫)。它將列印包含前兩個字元串但不包含第三個字元串的文件的路徑名。

如果一個文件不包含2019其他兩個測試,則不會執行,如果它不包含DSL,則不會執行最後一個測試,依此類推。

請注意,不是grep -v -qi FAILED我使用否定grep -qi FAILED作為第三個測試。我對文件是否包含不包含的行不FAILED感興趣,我對文件是否包含 FAILED感興趣,在這種情況下我想跳過這個文件。

有關的:


您的管道問題,

grep -r 2019 | grep -riv FAILED | grep -rl DSL

是最後一個grep將在目前目錄及以下目錄中的所有文件中遞歸查找,並將忽略來自管道先前階段的輸入。兩個初始grep呼叫可能會產生一些數據,但它們無法通過管道轉發這些數據,並且最終會在最後一個呼叫grep完成時被終止。

此外,正如我上面已經指出的,中間grep不會找到不包含. 的FAILED文件,它會找到包含除FAILED. 順便說一句,它也會忽略前面的輸入grep

引用自:https://unix.stackexchange.com/questions/531815