如何在文件中查找多个字符串?

SPn*_*ova 18 grep find

我使用以下命令查找具有给定字符串的文件:

find /var/www/http -type f | xargs grep -iR "STRING1"
Run Code Online (Sandbox Code Playgroud)

但是如何找到包含“STRING1”或“STRING2”或“STRING3”的文件?

此代码不起作用:

find /var/www/http -type f | xargs grep -iR "STRING1" | xargs grep -iR "STRING2"
Run Code Online (Sandbox Code Playgroud)

cuo*_*glm 25

POSIXly,使用grepwith-E选项:

find /var/www/http -type f -exec grep -iE 'STRING1|STRING2' /dev/null {} +
Run Code Online (Sandbox Code Playgroud)

或者-e

find /var/www/http -type f -exec grep -i -e 'STRING' -e 'STRING2' /dev/null {} +
Run Code Online (Sandbox Code Playgroud)

通过一些实现,至少在 GNU 系统、OSX 和 FreeBSD 上,您可以逃脱|

find /var/www/http -type f -exec grep -i 'STRING1\|STRING2' /dev/null {} +
Run Code Online (Sandbox Code Playgroud)


Pau*_*ida 8

为了便于维护(如果您要搜索的字符串列表将来可能会更改),我会将模式放在一个文件中(例如 patterns.txt)并使用-f开关(-R如果您限制find为文件,则不需要;-H会给如果只有一个文件名,请使用文件名;-F导致 grep 将您正在搜索的模式视为字符串,而不是正则表达式,这通常是您想要的):

find /var/www/http -type f -exec grep -iHFf patterns.txt {} +
Run Code Online (Sandbox Code Playgroud)


小智 7

只是使用有什么问题egrep

egrep -r 'string1|string2|string3' /var/www/http
Run Code Online (Sandbox Code Playgroud)

  • 你应该使用`grep -E ...`。根据 `(e)grep` 手册页,不推荐直接调用 `egrep`,并且提供该命令仅允许依赖它们的历史应用程序未经修改地运行。 (10认同)