grep以每行为基础显示模式的出现

时间:2015-07-23 16:01:39

标签: linux bash grep

从输入文件:

I am Peter
I am Mary
I am Peter Peter Peter
I am Peter Peter

我希望输出如下:

1 I am Peter
3 I am Peter Peter Peter
2 I am Peter Peter

其中1,3和2是“彼得”的出现。

我尝试了这个,但信息没有按照我想要的方式格式化:

grep -o -n Peter inputfile

2 个答案:

答案 0 :(得分:8)

使用grep并不容易解决,我建议移动一个工具"到awk

awk '$0 ~ FS { print NF-1, $0 }' FS="Peter" inputfile

输出:

1 I am Peter
3 I am Peter Peter Peter
2 I am Peter Peter

修改

回答评论中的问题:

  

如果我想要不区分大小写怎么办?如果我想要多个模式怎么办?   喜欢"彼得|玛丽|保罗",所以"我是Peter peter pAul Mary marY John",   会产生5?

的数量

如果您使用的是GNU awk,可以启用IGNORECASE并在FS中设置模式,如下所示:

awk '$0 ~ FS { print NF-1, $0 }' IGNORECASE=1 FS="Peter|Mary|Paul" inputfile

输出:

1 I am Peter
1 I am Mary
3 I am Peter Peter Peter
2 I am Peter Peter
5 I am Peter peter pAul Mary marY John

答案 1 :(得分:0)

您不需要-o-n。来自grep --help

  -o, --only-matching       show only the part of a line matching PATTERN
  ...
  -n, --line-number         print line number with output lines

删除它们,你的输出会更好。我认为你误解了-n - 它只显示了行号,而不是出现次数。

看起来你正试图计算每行“彼得”的数量。你需要的东西超过一个grep。 awk可能是个不错的选择。或者你可以遍历每一行,分成单词(比如一个数组)和grep -c每行的数组,打印行的计数。