grep多个文件时,如何在第一次匹配后停止?

时间:2009-03-30 23:02:56

标签: grep

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

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

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

由于

5 个答案:

答案 0 :(得分:12)

将grep的输出传递给head -n 1;这将拉动(并传递)第一行并忽略其余部分(即杀死源管道)。

答案 1 :(得分:5)

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

您可能希望向grep添加-H以显示filename:line而不仅仅是line。

答案 2 :(得分:4)

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

答案 3 :(得分:1)

以下是一个例子:

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

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

包含/dev/null会为您提供文件名,以防您遇到某种无法识别-H选项的恐龙grep。

答案 4 :(得分:0)

如果您使用ack,http://betterthangrep.com/,则可以使用-1标志。