Bash 不等待管道后的完整结果,而是立即对直接输出采取行动

Bash not waiting for full results after pipe but immediate action on direct output

当使用 grep -r "something" . 时,它会在找到内容时打印输出。

每当之后使用管道进行后处理时,它都会等待直到收到所有输出。

是否有某种方法/语法可以在每行可用时进行管道传输?

不要费心改进这个例子,它真的只是一个例子:

grep -r "something" . | grep -v "somethingelse"  # excluding somethingelse

结果只会在搜索完所有内容后出现(因为管道 |),但我正在寻找可以在 grep -r "something" . 的每一行上响应的语法作为 "line becomes available".

可以通过管道传输到等待输入并处理到达它的任何内容的程序,但是使用管道只会在完成时向它发送数据?

有人知道吗?

使用grep--line-buffered选项:

--line-buffered
         Force output to be line buffered.  By default, output is line
         buffered when standard output is a terminal and block buffered
         otherwise.

对于 grep,您可以使用 --line-buffered 选项。如果程序没有类似选项,可以使用stdbuf程序,例如:

tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq

在此示例中,stdbuf 运行 cut 程序,其输出流被修改为行缓冲。