我正在使用如下命令来查找包含单词“term”的文件:
grep -l term *
但我现在想找到包含两个不同单词的文件(我们称之为 termA 和 termB)——不一定在同一行。我想找到包含两个都术语,而不仅仅是具有任一术语的文件。
现在我可以为此编写一个繁琐的 bash 脚本,但是 grep、egrep、awk、sed 或其他任何工具是否有可以帮助我的工具?
提前致谢。
答案1
如果您的文件不包含空字节
在这种情况下,您可以grep
单独使用:
grep -Plz "termA.*termB|termB.*termA" *
怎么运行的:
这Perl 兼容正则表达式
termA.*termB
并termB.*termA
搜索包含两个术语的字符串。组合的 PCRE
termA.*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
您确实需要在每个“|”前使用转义字符“\”,但我相信您可以根据需要使用任意数量的搜索字符串