我有一个文本文件中的模式列表,为此我使用 bzgrep 匹配多个文件:
for pattern in $(cat ~/patterns.txt); do echo $pattern; bzgrep -i $pattern *.bz2; done
如何使 bzgrep (grep) 在当前模式的第一次匹配之后停止(我需要它完全停止,而不是在当前正在被 grep 的文件上停止)并继续下一个模式。我已经阅读了“-m 1”参数,但我认为它只在当前文件上停止。有任何想法吗?
谢谢
我有一个文本文件中的模式列表,为此我使用 bzgrep 匹配多个文件:
for pattern in $(cat ~/patterns.txt); do echo $pattern; bzgrep -i $pattern *.bz2; done
如何使 bzgrep (grep) 在当前模式的第一次匹配之后停止(我需要它完全停止,而不是在当前正在被 grep 的文件上停止)并继续下一个模式。我已经阅读了“-m 1”参数,但我认为它只在当前文件上停止。有任何想法吗?
谢谢
将 grep 的输出通过管道传输到head -n 1
; 这将拉(并传递)第一行并忽略其余部分(即终止源管道)。
for pattern in $(< ~/patterns.txt); do
echo "$pattern"
for i in *.bz2; do
bzgrep -i "$pattern" "$i" && break
done
done
您可能希望在 grep 中添加 -H 以显示文件名:行,而不仅仅是行。
您可能希望使用-q
( --quiet
aka --silent
) 开关。然后检查命令是否成功完成。这不输出任何内容,并在找到匹配项后立即停止搜索,只返回成功或失败。
这是一个例子:
for i in ~/bin/*; do grep -m 1 lua $i /dev/null && break; done
同样适用于bzgrep
; 在第一次成功匹配后,您退出循环。
/dev/null
如果您有某种无法识别该-H
选项的恐龙 grep,包括会为您提供文件名。
如果您在http://betterthangrep.com/上使用 ack,您可以出于这个原因使用 -1 标志。