![从子程序流 grep,而不是尾文件](https://linux22.com/image/49340/%E4%BB%8E%E5%AD%90%E7%A8%8B%E5%BA%8F%E6%B5%81%20grep%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E5%B0%BE%E6%96%87%E4%BB%B6.png)
是否存在一个简单的单行代码用于从程序而不只是文件中 grep 连续输出?
现在作为一个例子,我想跳过PHPUnit
其中包含的行。由于显而易见的原因,以下要点并没有做到这一点:
phpunit tests/cases | grep -v --line-buffered "PHPUnit"
它可以作为通用的 oneliner 来完成,而不需要用户定义的函数等吗?
答案1
这听起来像是 phpunit 命令的输出正在被缓冲(通过 PHP、Bash shell 或grep
)。有几种方法可以取消缓冲输出,使其响应更快。
解缓冲
$ 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"