如何从 tee 中 grep ?

如何从 tee 中 grep ?

我想检查命令的输出是否包含“重新运行”(然后重新运行),但我也想显示整个输出。我知道我可以使用其中之一:

command | tee >(grep rerun)
command | grep rerun

第一个按预期打印整个输出,但我不能将其用作条件,因为它始终返回 0。第二个仅打印包含 rerun 的行,但如果不匹配则返回 1。

我的使用示例:

while pdflatex paper.tex | grep -E "rerun LaTeX|run Biber"; do
    biber paper
done

此处提供的答案也没有帮助,因为 grep 总是返回 0。

答案1

只需使用

command | tee outfile | grep rerun

或者

while pdflatex paper.tex | tee outfile | grep -E "rerun LaTeX|run Biber"; do

您可以检查 grep 命令的状态,稍后可以查看文件“output”。

答案2

您可以查看一个文件并对该文件执行 grep 。然后你可以使用 grep 退出代码(0 表示匹配):

RERUN=1
while [[ $RERUN == 1 ]] ; do
  biber paper
  ! pdflatex paper.tex | tee output.txt && grep -E -q "rerun LaTeX|run Biber" output.txt
  RERUN=$?
done

第 4行!反转 grep 进程的退出代码,因为 grep 在找到匹配时返回 0,在没有匹配时返回 1,请参阅grep 手册页:

退出状态

   Normally the exit status is 0 if a line is selected, 1 if no lines were
   selected, and 2 if an error occurred.  However, if the -q or --quiet or
   --silent is used and a line is selected, the exit status is 0  even  if
   an error occurred.

第 5 行将最后一个退出代码 ( $?) 放入循环条件中使用的 RERUN 变量中。

我还-q向 grep 添加了不写入标准输出的选项

答案3

如果我们坚持stdout立即显示,那么grepProcess Substitution 中的输出应该重定向到一个文件,以免输出中出现重复的行,因此您必须这样做command | tee >(grep rerun >/tmp/my.log)

一旦生成了文件,您所要做的就是将[[ -s /tmp/my.log ]]其用作重新运行条件。

相关内容