我使用以下命令查找具有给定字符串的文件:
find /var/www/http -type f | xargs grep -iR "STRING1"
但是如何找到包含“STRING1”或“STRING2”或“STRING3”的文件?
此代码不起作用:
find /var/www/http -type f | xargs grep -iR "STRING1" | xargs grep -iR "STRING2"
答案1
POSIXly,使用grep
with-E
选项:
find /var/www/http -type f -exec grep -iE 'STRING1|STRING2' /dev/null {} +
或者-e
:
find /var/www/http -type f -exec grep -i -e 'STRING' -e 'STRING2' /dev/null {} +
通过某些实现,至少在 GNU 系统、OSX 和 FreeBSD 上,您可以逃避|
:
find /var/www/http -type f -exec grep -i 'STRING1\|STRING2' /dev/null {} +
答案2
为了便于维护(如果您要搜索的字符串列表将来可能会发生变化),我会将模式放入文件中(例如patterns.txt)并使用开关-f
(-R
如果您限制find
为文件,则没有必要;-H
将给出你的文件名,以防只有一个;-F
使 grep 将你正在搜索的模式视为字符串,而不是正则表达式,这通常是你想要的):
find /var/www/http -type f -exec grep -iHFf patterns.txt {} +
答案3
只使用有什么问题吗egrep
?
egrep -r 'string1|string2|string3' /var/www/http