我有很多文件,我想过滤掉包含2种模式的文件。然而,这些模式在不同的方面。我已经尝试使用grep和awk,但在这两种情况下,它们似乎只能在同一行上匹配模式。我知道grep是基于行的,但我对awk不太熟悉。这是我想出的内容,但它只适用于匹配两个字符串的打印行:
awk '/string1/ && /string2/' file
答案 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
。如果您在任何时候都看到了foo
和bar
,则打印当前文件的名称并跳到下一个输入文件,忽略当前文件中的所有剩余行,并在开始之前下一个文件,清除标记,说我们在新文件中既没有看到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将整个文件作为单个记录读取。