bash在文件中的不同行上搜索多个模式

时间:2014-09-28 14:50:23

标签: regex bash file search awk

我有很多文件,我想过滤掉包含2种模式的文件。然而,这些模式在不同的方面。我已经尝试使用grep和awk,但在这两种情况下,它们似乎只能在同一行上匹配模式。我知道grep是基于行的,但我对awk不太熟悉。这是我想出的内容,但它只适用于匹配两个字符串的打印行:

awk '/string1/ && /string2/' file

4 个答案:

答案 0 :(得分:4)

Grep可以使用xargs轻松处理此问题:

grep -l string1 * | xargs grep -l string2

在文件所在的目录中使用此命令,将显示生成的匹配项。

答案 1 :(得分:0)

你可以用find

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

答案 2 :(得分:0)

您可以使用GNU awk执行此操作:

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

如果您看到foo,则会增加变量seenFoo,如果您看到bar,则会增加变量seenBar。如果您在任何时候都看到了foobar,则打印当前文件的名称并跳到下一个输入文件,忽略当前文件中的所有剩余行,并在开始之前下一个文件,清除标记,说我们在新文件中既没有看到foo也没看到bar

答案 3 :(得分:0)

取决于您是否真的想要搜索正则表达式:

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

或字符串:

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

上面使用GNU awk for multi-char RS将整个文件作为单个记录读取。