跨文件搜索并返回前n个匹配项

11

我正在使用grep在一组文件中提取行:

grep somestring *.log

是否可以限制每个文件的最大匹配次数?理想情况下,我只想从每个*.log文件中打印出n行。

2个回答

22

限制每个文件为11行:

grep -m11 somestring *.log

+1 很好。我以为我了解grep,但我只知道旧版本(Sun OS4、SGI Irix、HPUX 10.20等等)。-m是在哪个版本中出现的? - Joseph Quinsey
@JosephQuinsey 我已经使用GNU grep-m选项有一段时间了(在Red Hat 4中已经存在)。干杯! - oHo
请注意,即使没有匹配所有11行,grep也会返回0。如果您将其作为测试的一部分使用,请考虑:[[ $(grep -m11 somestring * .log | wc -l)-eq 11]] - MatrixManAtYrService

2
这里有一种使用 awk 模拟它的替代方法:
awk 'f==10{f=0; nextfile; exit} /regex/{++f; print FILENAME":"$0}' *.log

解释:

  • f==10 : f 是一个标志位,我们设置并检查其值是否等于 10。您可以根据要匹配的行数进行配置。

  • nextfile : 将处理转移到下一个文件。

  • exit : 退出 awk

  • /regex/ : 搜索 regexpattern

  • {++f;print FILENAME":"$0} : 我们增加标志位并打印文件名和行号。


谢谢,这个能修改一下以打印出最后n个匹配吗? - Paul Dixon
@PaulDixon 你的意思是打印每个文件的最后10个匹配项吗? - jaypal singh
是的,也许我应该将其作为不同的问题询问。 - Paul Dixon
这里是一个单独的问题:https://dev59.com/y1_Va4cB1Zd3GeqPV7Jz - Paul Dixon
1
谢谢@PaulDixon..抱歉我被工作占据了,所以没能及时回复。我已经发布了一个答案,但看起来你已经找到了一个。 :) - jaypal singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接