我正在尝试打印具有 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
有什么建议吗?
使用 awk
awk 'gsub(/pattern/,"&")==2' file
如果你想传入参数
awk -vPattern="pattern" -vNum=2 'gsub(Pattern,"&")==Num' file
在现有代码中,使用 gawk
将count=
赋值替换为以下内容:
count=$(echo $line |gawk -F "$string" -- '{print NF-1}')
$string
可以容纳单词或正则表达式。 -F "$string"
赋值使 gawk 拆分字段在 $string
的实例中。 因此,NF
字段数将是 $string
的出现次数,加上 1 表示最后一次出现$string
之后的任何内容(即使这是一个空字符串)。 因此,NF-1
是$string
的出现次数。
示例:由于-F pattern
,gawk会断线
a pattern b pattern c
分为三个领域:a
、b
和c
。 由于有三个字段,因此这些字段之间有两个分隔符。 因此,NF-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"