我正在尝试打印其中包含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
有什么建议吗?
答案 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
分为三个字段:a
,b
和c
。因为有三个字段,所以这些字段之间有两个分隔符。因此,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"