我正在使用grep使用以下参数递归搜索目录,希望只返回第一个匹配项。不幸的是,它返回了不止一个 - 实际上是我最后一次看的两个。看起来我有太多的争论,特别是没有得到预期的结果。 : - /
# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory
返回:
Pulsanti Operietur
Pulsanti Operietur
也许grep不是最好的方法吗?你告诉我,非常感谢。
答案 0 :(得分:394)
-m 1
表示返回任何给定文件中的第一个匹配项。但它仍将继续搜索其他文件。此外,如果在同一行中有两个或多个匹配,则将显示所有这些。
您可以使用head -1
来解决此问题:
grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -1
答案 1 :(得分:28)
您可以将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
消失时,它仍会输出管道。
这假设没有文件名包含换行符。
答案 2 :(得分:21)
我的grep-a-like程序ack
有一个-1
选项,可以在任何地方找到的第一个匹配项停止。它支持@mvp引用的-m 1
。我把它放在那里因为如果我正在搜索一个大的源代码树来找到我知道的东西只存在于一个文件中,就没必要找到它并且必须按Ctrl-C。
答案 3 :(得分:8)
如果要搜索当前目录中出现的特定单词,则要打印整行和文件名,可以使用下面的命令。
grep -m 1 -r "Not caching" * | head -1
答案 4 :(得分:3)
单个班轮,使用find
:
find -type f -exec grep -lm1 "PATTERN" {} \; -a -quit
答案 5 :(得分:3)
阅读 grep 手册 (man grep),这是找到第一个与扩展正则表达式匹配的最小命令。获取在我的笔记本电脑中不是 eth0 的以太网名称的示例!
$ ifconfing | grep -E -o -m 1 "^[a-z0-9]+"
说明: -E 用于扩展正则表达式, -o 只返回匹配项, -m 1 只看一行