我在文本文件中有一个模式列表,我使用bzgrep来匹配多个文件:
for pattern in $(cat ~/patterns.txt); do echo $pattern; bzgrep -i $pattern *.bz2; done
如何使bzgrep(grep)在当前模式的第一次匹配后停止(我需要它完全停止,而不是停止当前文件被grep'ed)并继续下一个模式。我已经读过“-m 1”参数,但我认为它只会在当前文件上停止。有什么想法吗?
由于
答案 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标志。