2014-09-28 28 views
1

我有很多文件,我想過濾掉包含2個模式的文件。但是這些模式是不同的。我嘗試過使用grep和awk,但在這兩種情況下,它們似乎只能用於同一行上的匹配模式。我知道grep是基於行的,但我對awk不太熟悉。以下是我想出了,但它只能同時匹配字符串打印線:bash搜索文件中不同行上的多個模式

awk '/string1/ && /string2/' file 
+0

你的意思是這些模式出現*跨行*例如。你想要一個包含'foo \ nbar'的文件? – kojiro 2014-09-28 14:52:10

+0

@kojiro foo和酒吧在不同的線路上 – stevo 2014-09-28 15:47:44

回答

3

grep的將很容易使用xargs處理這個問題:

grep -l string1 * | xargs grep -l string2 

使用目錄中的這個命令,其中文件位於,並顯示匹配結果。

+0

嘗試過,但它似乎將該匹配行上的其他詞作爲文件處理 – stevo 2014-09-28 15:52:40

+0

不確定我關注。上面的命令應該顯示包含匹配的兩個字符串的目錄中的文件名 - 這是預期的行爲。 – 2014-09-28 16:36:44

0

你可以做到這一點與發現

find -type f -exec bash -c "grep -q string1 {} && grep -q string2 {} && echo {}" ";" 
0

您可以用GNU awk做這樣的:

awk '/foo/{seenFoo++} /bar/{seenBar++} seenFoo&&seenBar{print FILENAME;seenFoo=seenBar=0;nextfile}' file* 

,說......如果你看到foo,增加可變seenFoo,同樣,如果你見bar,增量變量seenBar。如果您在任何時候都看到foobar,則打印當前文件的名稱並跳至下一個輸入文件,忽略當前文件中的所有剩餘行,並且在開始下一個文件之前清除標記以說明我們在新文件中既沒有看到foo也沒有看到bar

0

根據OM你是否真的要搜索的正則表達式:

gawk -v RS='^$' '/regexp1/ && /regexp2/ {print FILENAME}' file 

或字符串:

gawk -v RS='^$' 'index($0,"string1") && index($0,"string2") {print FILENAME}' file 

以上使用GNU AWK多焦RS讀取整個文件作爲單一記錄。