只grep第一场比赛,并停止

我正在用greprecursionsearch一个目录,希望只返回第一个匹配。 不幸的是,我最后一次看到的是两个以上的事实。 似乎我有太多的争论,特别是没有得到预期的结果。 : – /

# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory 

收益:

 Pulsanti Operietur Pulsanti Operietur 

也许grep不是最好的方法来做到这一点? 你告诉我,非常感谢。

-m 1表示返回任何给定文件中的第一个匹配项。 但它仍然会继续search其他文件。 另外,如果在同一行中有两个或更多匹配,则将显示全部。

你可以使用head -1来解决这个问题:

 grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -1 

grep-a-like程序ack有一个-1选项,在任何地方find的第一个匹配处停止。 它支持@mvp所指的-m 1 。 我把它放在那里,因为如果我正在search一个大的源代码树来find我知道的东西只存在于一个文件中,没有必要find它,必须按Ctrl-C。

您可以将grep结果与stdbuf结合使用。

请注意,为了确保在第N次匹配之后停止,您需要使用stdbuf来确保grep不会缓冲其输出:

 stdbuf -oL grep -rl 'pattern' * | head -n1 stdbuf -oL grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -n1 stdbuf -oL grep -nH -m 1 -R "django.conf.urls.defaults" * | head -n1 

只要head消耗1行,它终止, grep将收到SIGPIPE因为它仍然输出的东西pipe道,而head走了。

这假定没有文件名包含换行符。

单行,用find

 find -type f -exec grep -lm1 "PATTERN" {} \; -a -quit