grepping多个字符串

时间:2012-07-10 21:03:15

标签: shell awk grep

我正在使用grep命令从文件中获取所需的信息。我正在使用两个grep语句,如下面的

XXXX='grep XXXX FILE A|sort|uniq|wc -l'
grep YYYY FILE A|uniq| > FILE B

现在文件被遍历两次。但我只是想知道,如果我能够在单个文件遍历中执行这两个步骤,即我想知道我是否可以使用类似于egrep的东西,我可以grep两个字符串和一个字符串我将使用它将变量和另一个字符串的输出转换为文件。

3 个答案:

答案 0 :(得分:1)

您可以使用以下代码。在这里,我们仅在所有文件中搜索包含XXXX或YYYY的行,并将结果行存储到数组中。然后我们使用这个数组的元素来选择包含XXXX的行和包含YYYY的行。

filtered=`grep -E '(XXXX|YYYY)' FILE A`
XXXX=`for line in ${filtered[@]}; do echo $line; done | grep XXXX | sort | uniq | wc -l`
for line in ${filtered[@]}; do echo $line; done | grep YYYY | uniq > FILE B

因此文件不会被遍历两次!

答案 1 :(得分:0)

或者使用egrep与析取:

egrep '(XXXX|YYYY)' FILE A | sort | uniq | ...

或者awk:

awk '/XXXX|YYYY/' FILE A | sort | uniq | ...

答案 2 :(得分:0)

有一个尾随'|'您的问题中的符号,也许您打算将YYYY行也用sort(或使用sort -u!)传送,在这种情况下您可以简单地执行:

awk '/XXXX/ { if( !x[$0]++ ) xcount += 1 } 
     /YYYY/ { if( !y[$0]++ ) ycount += 1 }
  END { print "XXXX:", xcount
        print "YYYY:", ycount
        for( i in y ) print i | "sort > FILEB"
  }' FILE

这会扫描文件一次,只要看到包含适当模式的uniq行,就会递增计数器。请注意,此处没有很好地定义YYYY行数组上的迭代顺序,因此需要进行排序。某些版本的awk提供了对数组进行排序的能力,而不依赖于外部实用程序,但并非所有版本都可以。如果你想这样做,请使用perl。