我正在尝试找到一种更好的方法来确定给定目录中的哪些文件包含所有给定的搜索字符串集。我目前的做法似乎很尴尬。
例如,如果我想查找哪些文件包含“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计算机上
答案 0 :(得分:1)
您可以使用xargs将grep调用链接在一起:
grep -l "aaa" * | xargs grep -l "bbb" | xargs grep -l "ccc" | xargs grep -l "ddd"
答案 1 :(得分: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。