使用 awk 或 grep 时如何通过多个关键字搜索?

使用 awk 或 grep 时如何通过多个关键字搜索?

我有一组文件。我想通过搜索来grep查找全部和唯一那些包含其中任何地方的两个都琴弦keyword1 keyword2

我也想知道如何使用 awk 来做到这一点。

答案1

对于 grep,管道符号将组合正则表达式中的字符串分隔开;在某些系统上,可能需要使用 egrep 来激活此功能:

[madhatta@anni ~]$ egrep 'exact|obsol' /etc/yum.conf
exactarch=1
obsoletes=1

我希望 awk 的语法类似。

编辑:是的:

[madhatta@anni ~]$ awk '/exact|obsol/ {print $1}' /etc/yum.conf
exactarch=1
obsoletes=1

编辑2:

您已经阐明了您的请求,因此下面介绍如何使用 grep 来执行此操作:

grep -l keyword1 * | xargs -d '\n' grep -l keyword2

这将在给定目录 ( *) 中的所有文件中搜索 keyword1,并将匹配文件列表传递到第二个 grep,后者将通过 xargs 搜索第二个字符串。恐怕我不会费心去做这件事,awk因为它听起来有点像家庭作业问题。如果您有使用 awk 的商业案例,请告诉我们。

答案2

在一个文件中搜索

使用 grep 在文件“myfile.conf”中查找包含“keyword1”或“keyword2”的行:

grep -e "keyword1\|keyword2" myfile.conf

|在 zsh 中至少需要使用反斜杠对管道字符进行转义。

在目录中的所有文件中搜索

要在目录中搜索包含“关键字1”或“关键字2”的文件:

grep -r -e "keyword1\|keyword2" /path/to/my/directory

如果您想进行不区分大小写的搜索,-i也请添加该选项。

答案3

如果我理解正确的话,你想搜索包含以下文件的所有文件keyword1 keyword2在特定的文件夹中,所以,尝试这个:

$ find /path/to/folder -type f -print0 | xargs -0 grep -li "keyword1" | \
                                    xargs -I '{}' grep -li "keyword2" '{}'
  • -print0 | xargs -0注意文件名中有空格
  • -I告诉用参数列表xargs替换'{}'
  • grep -li 打印文件名而不是匹配模式。我使用-i 它来区分大小写。

相关内容