Grep 格雷普只在第一场比赛中停下来

Grep 格雷普只在第一场比赛中停下来,grep,Grep,我正在使用grep递归地搜索一个目录,其中包含以下参数,希望只返回第一个匹配项。不幸的是,它返回了不止一个——事实上,上次我查看时返回了两个。我似乎有太多的争论,尤其是没有得到想要的结果-/ # grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory 返回: Pulsanti Operietur Pulsanti Operietur 也许grep不是最好的方法?您告诉我,非常感谢。-m1表示返回任何给定文件中的第一个匹配项。

我正在使用grep递归地搜索一个目录,其中包含以下参数,希望只返回第一个匹配项。不幸的是,它返回了不止一个——事实上,上次我查看时返回了两个。我似乎有太多的争论,尤其是没有得到想要的结果-/

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

Pulsanti Operietur
Pulsanti Operietur

也许grep不是最好的方法?您告诉我,非常感谢。

-m1
表示返回任何给定文件中的第一个匹配项。但它仍将继续在其他文件中搜索。此外,如果同一行中有两个或多个匹配项,则将显示所有匹配项

您可以使用
head-1
来解决此问题: 每个grep选项的说明:
我的grep-a-like程序有一个
-1
选项,在任何地方找到的第一个匹配项时停止。它还支持@mvp所指的
-m1
。我把它放在那里是因为如果我在搜索一棵大树的源代码来查找我知道只存在于一个文件中的东西,就不必查找它,只需按Ctrl-C键。

一行,使用
find

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

您可以将
grep
结果与stdbuf一起传送到
head

注意,为了确保在第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
,因为它在
head
消失时仍向管道输出某些内容


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

如果要打印整行和文件名(如果搜索的当前目录中出现了特定单词),则可以使用下面的命令

grep -m 1 -r "Not caching" * | head -1
阅读grep手册(mangrep),这是查找扩展regexp的第一个匹配项的最小命令。示例获取的以太网名称在我的笔记本电脑中不是eth0

$ ifconfing | grep -E -o -m 1 "^[a-z0-9]+"
说明: -E表示扩展regexp, -o仅返回比赛,
-m 1看起来只有一行

太棒了!非常感谢。顺便说一句-我在命令中的所有其他参数都是必需的吗?如果我不能偶然地(以防万一)用管道输送,那该怎么办呢?我不认为它们是必要的(除了
-r
显然),但它们不应该伤害我所需要的东西(尽管我不会使用
-a
)。我的模式在同一行上被发现了两次,因此
grep-m1
返回了两个实例<代码>|头-1解决了它@Chris_Rands确切的行为取决于你正在运行的外壳。head将在遇到第一行时立即退出。grep将在head退出后下次尝试写入时退出。有些shell将等待管道的所有元素完成,有些shell将在管道中的最后一个程序退出时导致整个管道关闭。@3Qn,我不理解您的评论:
首先不是从结果开始的。此答案打印任何文件中的第一个匹配项并停止。你还期望什么?那么你会说ack比grep快?我也很关心速度因素。ack可能比grep快,这取决于你在搜索什么。请注意,ack是关于搜索源代码的。如果你想搜索普通文件,至少在ack 1.x中是这样。去阅读关于ack的文章,看看它是否适合你的需要。我已经使用ack很长时间了,但最近我发现它比ack更快。我相信这应该是唯一的答案,因为OP说他希望用grep完成,但另一个答案使用head(当然,这两种方法都有效)但也有一些嵌入式/自建环境,使用最少的工具,其中grep很常见,tail/head不常见。值得一提的是,
ag
可能很快,但它没有
-1
选项,在这种情况下很有用。这将非常缓慢,因为find将为找到的每个文件生成grep副本<代码>grep-r
工作速度快得多-它是唯一一个进行目录遍历的副本;尽管find可以定制为只对过滤结果进行操作,这可以使操作比catch-all grep快得多。取决于上下文。我正尝试采用此解决方案,使用
xargs
find来搜索大量存档文件-名称'*.gz'| xargs-I'{}'stdbuf-oL zgrep-al'pattern'{}}head-n1
。但是,这不会在第一次匹配时终止。有什么建议吗?
grep
--line buffered
选项会不会在不调用其他实用程序的情况下防止缓冲区开销?
grep -m 1 -r "Not caching" * | head -1
$ ifconfing | grep -E -o -m 1 "^[a-z0-9]+"