在单个 find 命令中执行多个 grep

在单个 find 命令中执行多个 grep

我想使用 find 命令同时查找一些包含多个模式的文件。

我尝试过这样的事情:

find . -name "*.xml" -exec grep -iH keyword1 + && grep -iH "keyword2" {} \;

但上面的命令不起作用。

可以在 bash 中实现吗?

答案1

据我了解,您想要列出包含两个都“关键字1”和“关键字2”。为此,您可以-exec按以下方式使用两个测试:

find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -iH keyword2 {} \;

这将有条件地运行第二个grep- 如果第一个返回 true。该-q选项阻止从第一个输出grep,因为它将列出仅包含“keyword1”的所有文件。

由于该-H选项将匹配行与文件名一起输出,因此您可能想使用它-l。所以

find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -il keyword2 {} \;

这将产生与 Caleb 建议类似的输出,但不需要额外的-print.

答案2

首先,要使用 find 执行此操作,您需要添加第二个-exec参数。每个参数只能运行一个命令。如果您需要运行多个命令,则必须通过将一个命令设置为 shell 并运行多个命令来使用 hack。这是find做工作的:

find . -name "*.xml" -exec grep -qi "keyword1" {} \; -exec grep -qi "keyword2" {} \; -print

请注意,我使用 find-print选项来输出文件名,而不是让 grep 执行此操作,并使用-qgrep 选项将其置于静默模式,以便它仅给出一个返回代码,find 可以使用该返回代码来判断结果是否为无论真假,然后继续。如果到达最后一步(意味着两个文件都匹配),它将打印输出。

然而,这是低效的,因为 grep 实际上必须扫描所有文件两次。如果您的问题是字面上的意思,则必须这样做,但如果您想查找包含任何字符串的文件,您可以使用 grep 在一次传递中搜索两种模式,如下所示:

find . -name "*.xml" -exec grep -qi -e "keyword1" -e "keyword2" {} \; -print

编辑:你的问题不清楚你到底想要发生什么,而且我给出的两个例子实际上做了不同的事情。第一个是 AND 运算,仅打印包含两个关键字的文件,第二个是 OR 运算,如果文件名包含任一字符串,则打印文件名。选择你的毒药。

答案3

或者只使用egrep:

find . -name "*.xml" -exec egrep -iH "keyword1|keyword2" {} \;

相关内容