搜索包含多个术语的文件(grep、awk?)

搜索包含多个术语的文件(grep、awk?)

我正在使用如下命令来查找包含单词“term”的文件:

grep -l term *

但我现在想找到包含两个不同单词的文件(我们称之为 termA 和 termB)——不一定在同一行。我想找到包含两个都术语,而不仅仅是具有任一术语的文件。

现在我可以为此编写一个繁琐的 bash 脚本,但是 grep、egrep、awk、sed 或其他任何工具是否有可以帮助我的工具?

提前致谢。

答案1

如果您的文件不包含空字节

在这种情况下,您可以grep单独使用:

grep -Plz "termA.*termB|termB.*termA" *

怎么运行的:

  • Perl 兼容正则表达式 termA.*termBtermB.*termA搜索包含两个术语的字符串。

  • 组合的 PCREtermA.*termB|termB.*termA匹配所有包含两个术语的字符串。

  • 最后,该-z开关使数据行以空字节而不是换行符结束。

顺便说一句,没有需要使用-P。如果您希望继续使用POSIX 基本正则表达式,语法类似:

grep -lz "termA.*termB\|termB.*termA" *

如果您的文件包含空字节

在这种情况下,您将需要辅助工具:

(grep -l termA * ; grep -l termB *) | sort | uniq -d

怎么运行的:

  • grep -l termA * ; grep -l termB *显示包含其中一个术语的所有文件。同时包含两个术语的文件将显示两次。

  • sort对输出进行排序。

  • uniq -d仅显示重复的行(需要排序的行)。

答案2

您可以使用-e-f选项来搜索多个表达式(来自man grep):

    -e PATTERN, --regexp=PATTERN
          Use  PATTERN  as  the  pattern.   This  can  be  used to specify
          multiple search patterns, or to protect a pattern beginning with
          a hyphen (-).  (-e is specified by POSIX.)

   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

因此你可以这样使用:

$ grep -e termA -e termB *

答案3

据我所知,grep 支持正则表达式。我使用以下语法来搜索多个术语:

    grep 'termA\|termB' /i/am/a/path

您确实需要在每个“|”前使用转义字符“\”,但我相信您可以根据需要使用任意数量的搜索字符串

相关内容