【发布时间】:2014-12-12 16:16:18
【问题描述】:
如何在不实际过滤或突出显示的情况下进行 grep?
目标是在不影响输出的情况下找出某个文本是否在输出中。我可以 tee 到一个文件,然后离线检查文件,但是,如果输出很大,那是浪费时间,因为它只在处理完成后处理输出:
command | tee file
file=`mktemp`
if grep -q pattern "$file"; then
echo Pattern found.
fi
rm "$file"
我想我也可以使用 grep 的前 (-B) 和后 (-A) 标志来实现实时处理,但如果没有匹配项,则不会输出任何内容。
# Won't even work - DON'T USE.
if command | grep -A 1000000 -B 1000000 pattern; then
echo Pattern found.
fi
有没有更好的方法来实现这一点?类似于“假装你正在 grep 并设置退出代码,但不要 grep 任何东西”。
(真的,我要做的是管道stderr,因为我正在寻找某个错误,所以我将使用command | ...而不是command 2> >(... >&2; result=${PIPESTATUS[*]}),它实现了相同的效果,只有它适用于stderr。 )
【问题讨论】:
-
我不想抑制任何命令的输出。
-
您可以实现您想要的,但问题是一旦
grep找到匹配项,command也会被终止,从而无法保留输出(因为命令得到停在中间)。您能解释一下您要实现的目标是什么吗? -
目标是找出某个错误是否由程序输出。我希望在错误发生时也将错误打印到终端,因为错误可能取决于也在标准输入上输出的上下文,并且将所有错误缓存到文件并仅在最后回显它们会破坏这种关系。