11

我有一个文本文件中的模式列表,为此我使用 bzgrep 匹配多个文件:

for pattern in $(cat ~/patterns.txt); do echo $pattern; bzgrep -i $pattern *.bz2; done

如何使 bzgrep (grep) 在当前模式的第一次匹配之后停止(我需要它完全停止,而不是在当前正在被 grep 的文件上停止)并继续下一个模式。我已经阅读了“-m 1”参数,但我认为它只在当前文件上停止。有任何想法吗?

谢谢

4

5 回答 5

13

将 grep 的输出通过管道传输到head -n 1; 这将拉(并传递)第一行并忽略其余部分(即终止源管道)。

于 2009-03-30T23:07:55.753 回答
5
for pattern in $(< ~/patterns.txt); do
  echo "$pattern"
  for i in *.bz2; do
    bzgrep -i "$pattern" "$i" && break
  done
done

您可能希望在 grep 中添加 -H 以显示文件名:行,而不仅仅是行。

于 2009-03-30T23:09:03.037 回答
4

您可能希望使用-q( --quietaka --silent) 开关。然后检查命令是否成功完成。这不输出任何内容,并在找到匹配项后立即停止搜索,只返回成功或失败。

于 2009-03-30T23:08:06.750 回答
1

这是一个例子:

for i in  ~/bin/*; do grep -m 1 lua $i /dev/null && break; done

同样适用于bzgrep; 在第一次成功匹配后,您退出循环。

/dev/null如果您有某种无法识别该-H选项的恐龙 grep,包括会为您提供文件名。

于 2009-03-31T00:13:00.900 回答
0

如果您在http://betterthangrep.com/上使用 ack,您可以出于这个原因使用 -1 标志。

于 2009-05-09T03:47:50.847 回答