linux – 使用grep查找目录中包含两个字符串的所有文件

参见英文答案 > How to search files where two different words exist?                                    5个
我试图找出正确的语法来找到两个字符串,每个字符串的整个部分,在文件中的任何地方(不必彼此靠近).因此,任何同时具有foo并且编号为321的文件都不必是单独的,并且可以是子字符串应匹配的文件.没有太多运气,我尝试了以下内容:

grep 'foo\|321' *

grep 'foo|321'
最佳答案
您可以使用简短的脚本执行此操作:

for FILE in *
do
  grep -q foo $FILE && grep -q 321 $FILE && echo $FILE
done

您也可以在一行上执行此操作:

for FILE in *; do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE; done

grep返回0(true)如果找到字符串和&&分离命令意味着第二个命令只有在第一个命令为真时才会运行. -q选项确保grep不输出任何内容.

只有在同一文件中找到两个字符串时,才会运行echo.

我想到了另一种方法.如果相关文件大于您安装的RAM,这种方式可能会更有效,因为它只需要浏览每个文件一次.

 for FILE in *
 do
   test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE
 done

和单行版本:

 for FILE in *; do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE; done

转载注明原文:linux – 使用grep查找目录中包含两个字符串的所有文件 - 代码日志