0

我试图找到一种更好的方法来确定给定目录中的哪些文件包含所有给定的搜索字符串集。我目前这样做的方式似乎很尴尬。

例如,如果我想查找哪些文件包含“aaa”、“bbb”、“ccc”和“ddd”,我会这样做:

grep -l "aaa" * > out1
grep -l "bbb" `cat out1` > out2
grep -l "ccc" `cat out2` > out3
grep -l "ddd" `cat out3` > out4
cat out4
rm out1 out2 out3 out4

如您所见,这似乎很笨拙。有更好的想法吗?

编辑:我在 Solaris 10 机器上

4

2 回答 2

1

您可以使用 xargs 将 grep 调用链接在一起:

grep -l "aaa" * | xargs grep -l "bbb" | xargs grep -l "ccc" | xargs grep -l "ddd"
于 2013-01-28T18:20:33.050 回答
1

这可能会有所帮助:

for file in * ; do
   matchall=1
   for pattern in aaa bbb ccc ddd ; do
      grep "$pattern" "$file" >/dev/null || { matchall=0; break ; }
   done
   if [ "$matchall" -eq "1" ]; then echo "maching all : $file" ; fi
done

(您可以通过替换aaa bbb ccc ddd为类似的东西来添加模式$(cat patternfile)

对于感兴趣的人:它1)循环遍历每个文件,2)遍历每个文件:它假设这将匹配所有模式,并循环遍历模式:只要文件中没有出现模式,该模式就会循环退出,不打印该文件的名称,然后检查下一个文件。即,它只打印一个已经通过所有模式的文件,而没有将“matchall”设置为0。

于 2013-01-28T18:39:55.357 回答