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

Linux grep以每行为基础显示模式的出现,linux,bash,grep,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 awk '$0 ~ FS { print NF-1, $0 }' IGNORECASE=1 FS="Peter|Mary|Paul" inputfile 其中1、3和2是“彼得”的出现 我试过了,但信息

从输入文件:

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
awk '$0 ~ FS { print NF-1, $0 }' IGNORECASE=1 FS="Peter|Mary|Paul" inputfile
其中1、3和2是“彼得”的出现

我试过了,但信息的格式不是我想要的:

grep -o -n Peter inputfile

使用
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
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
###编辑

回答评论中的问题:

如果我想要不区分大小写呢?如果我想要多个图案呢 就像“彼得·玛丽·保罗”,所以“我是彼得·保罗·玛丽·约翰”, 将产生5的计数吗

如果您使用的是GNU awk,可以通过启用
IGNORECASE
并在
FS
中设置模式来实现:

1 I am Peter
3 I am Peter Peter Peter
2 I am Peter Peter
awk '$0 ~ FS { print NF-1, $0 }' IGNORECASE=1 FS="Peter|Mary|Paul" inputfile
输出:

1 I am Peter
3 I am Peter Peter Peter
2 I am Peter Peter
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

您不需要
-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
每一行的数组,以打印行的计数。

至少有500000行,awk的性能是一个问题,这是通过来自的系统调用实现的Perl@CindyTurlington:这相当有效,我不确定你能不能用grep提高效率。根据您使用的awk版本的不同,您可以通过切换到
nawk
mawk
将其速度提高一个数量级。在awk之前使用LC_ALL=A,这似乎要快很多faster@CindyTurlington:当然LC_ALL=C?@CindyTurlington,我建议你为此编写一个C程序。Regexp在C中实现得很好。但是如果搜索字符串是静态的(没有Regexp运算符,如
*
+
),则有更有效的算法允许搜索,而不必检查原始文本中的所有字符。您搜索的字符串是简单的字符串吗?(或者使用regexp运算符,如
|
*
或括号
)。如果您搜索
pepe
,并且您有
pepepe
这样的内容,那么您的眼病发生率是多少?(这可算作一次或两次此类事件)