使用grep或awk查找包含不同行上的“a”和“b”的文件

时间:2010-09-22 20:52:22

标签: unix awk grep

有没有办法使用grepawk来查找同时包含以下内容的文本文件? “a”和“b”但在这种情况下“a”和“b”在不同的行上?

4 个答案:

答案 0 :(得分:5)

这是一个简单的awk解决方案:

awk 'BEGIN {acnt=0; bcnt=0;} /a/ {acnt++;} /b/ {bcnt++} END { if (acnt > 0 && bcnt > 0) print "Matches"; }' $FILE

一种稍微简单的方法就是使用grep,利用其返回值作为找到该值的指标:

grep -l a $FILE && grep -l b $FILE && echo "Both a and b found in $FILE"

您可能想要重定向标准输出,但上述内容应该简单实用。如果需要,你可以把它包装成循环:

files=""
for x in *; do
    grep -l a $x && grep -l b $x && files="$files $x" # assuming no spaces
done
# now you can iterate over $files

答案 1 :(得分:2)

awk '/a/{f=1}/b/{g=1}END{if(f && g) print "matches"}' file

答案 2 :(得分:0)

你或许可以用一些讨厌的shell来解决这个问题,它解析了“a”的grepping输出并使用它来构建一个grep为“b”的文件列表,但是如果它是我的话我会汇总了一个简短的perl脚本。

答案 3 :(得分:0)

看看这是否适合你:

grep -lP '(?m)(a.*(.*\n)*.*b)|(b.*(.*\n)*.*a)' *