从子程序流 grep,而不是尾文件

从子程序流 grep,而不是尾文件

是否存在一个简单的单行代码用于从程序而不只是文件中 grep 连续输出?

现在作为一个例子,我想跳过PHPUnit其中包含的行。由于显而易见的原因,以下要点并没有做到这一点:

phpunit tests/cases | grep -v --line-buffered "PHPUnit"

它可以作为通用的 oneliner 来完成,而不需要用户定义的函数等吗?

答案1

这听起来像是 phpunit 命令的输出正在被缓冲(通过 PHP、Bash shell 或grep)。有几种方法可以取消缓冲输出,使其响应更快。

解缓冲

您可以尝试使用unbuffer命令是的一部分expect

$ unbuffer phpunit tests/cases | grep -v --line-buffered "PHPUnit"

标准缓冲区

您可以尝试使用stdbuf命令禁用缓冲。

$ stdbuf -i0 -o0 -e0 phpunit tests/cases | grep -v --line-buffered "PHPUnit"

开关的详细信息:

   -i, --input=MODE
          adjust standard input stream buffering

   -o, --output=MODE
          adjust standard output stream buffering

   -e, --error=MODE
          adjust standard error stream buffering

因此,上面将 STDIN、STDOUT、STDERR 的缓冲设置为零。

grep

Grep 本身可能是缓冲输出的罪魁祸首。您可以告诉它一次只缓冲一行输出。 (您已经提到/发现了这一点,但我提到它是为了让本问答的未来观众能够理解那里也存在缓冲)。

$ phpunit tests/cases | grep -v --line-buffered "PHPUnit"

相关内容