用於查找內部文件的管道 grep
(從 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
這將從目前目錄和任何子目錄(遞歸地)獲取每個正常文件,並測試它是否包含字元串
2019
、DSL
和FAILED
(不區分大小寫)。它將列印包含前兩個字元串但不包含第三個字元串的文件的路徑名。如果一個文件不包含
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
。