在同一行中具有两个相同字符串实例的打印行

时间:2016-06-02 12:19:58

标签: bash shell awk sed grep

我正在尝试打印其中包含N个(本例中为2个)模式的行。

例如:(输入文件)

cat data.txt
hello all
this is a text file
and this line is having one pattern
and this line is having two pattern, and here is another one : pattern. so its two in this line.
in this line pattern is three times , here is two more pattern and pattern

输出:(打印行包含两个字符串=模式)

and this line is having two pattern, and here is another one : pattern. so its two in this line.

我正朝着方向努力,但是grep -c并没有帮助我。

string=pattern
while read line
     do

     count=$(echo $line |grep -c $string)
     #this always gives me 1, as its a count based on line. 
     if [ "$count" -eq 2 ];then
        echo $line
     fi

done <data.txt

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

使用awk

awk 'gsub(/pattern/,"&")==2' file

如果你想传递参数

awk -vPattern="pattern" -vNum=2 'gsub(Pattern,"&")==Num' file

答案 1 :(得分:2)

在现有代码中,使用count=gawk作业替换为以下内容:

count=$(echo $line |gawk -F "$string" -- '{print NF-1}')

$string可以包含单词或正则表达式。 -F "$string"分配会在$string的实例处生成gawk分割字段。因此,字段NF的数量将是$string的出现次数,加上最后一次出现$string之后的任何内容(即使这是一个空字符串)。因此,NF-1$string的出现次数。

示例:因为-F pattern,gawk会破坏行

a pattern b pattern c

分为三个字段:abc。因为有三个字段,所以这些字段之间有两个分隔符。因此,NF-1比字段数少一个,就是这些字段之间的分隔符数。

答案 2 :(得分:1)

尝试:

p1=pattern
n=2

pn="$p1"
for i in $(seq 2 $n); do
  pn="$pn.*$p1"
done
pn1="$pn.*$p1"

cat data.txt | egrep "$pn" | egrep -v "$pn1"