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

Pet*_*owe 5 linux grep awk sed

我正在使用这样的命令来查找其中包含“term”一词的文件:

grep -l term *
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢。

Den*_*nis 4

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

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

grep -Plz "termA.*termB|termB.*termA" *
Run Code Online (Sandbox Code Playgroud)

怎么运行的:

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

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

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

顺便说一下,没有必要使用-P. 如果您更愿意继续使用POSIX 基本正则表达式,语法类似:

grep -lz "termA.*termB\|termB.*termA" *
Run Code Online (Sandbox Code Playgroud)

如果您的文件包含空字节

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

(grep -l termA * ; grep -l termB *) | sort | uniq -d
Run Code Online (Sandbox Code Playgroud)

怎么运行的:

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

  • sort对输出进行排序。

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