如何将活动流的输出传送到其他命令

如何将活动流的输出传送到其他命令

我正在尝试将活动流通过管道传输到另一个命令(可能是 bash 脚本),但它总是要等待整个流完成后再处理该命令。sg 我可以这样做:

tail file.log | grep keyword | xargs -L 1 echo ...

并且它正确地输出了 file.log 中匹配的行,前面带有“...”。显然我不想只回显,这只是为了简化示例(我会用自定义 bash 脚本替换它)。现在,当我尝试这个时:

tail -f file.log | grep keyword

这是可行的,因为它输出匹配的行,然后暂停直到 file.log 发生变化,然后输出任何新的匹配行。但是,如果我尝试这样做:

tail -f file.log | grep keyword | xargs -L 1 echo ...

它什么都没输出——我猜它正在等待 tail -f 打开的流结束。我也试过这个:

tail -f file.log | grep keyword | while read line; do echo...$line; end

行为没有变化。我在这里读到过其他问题,说这应该可行。我正在运行 Ubuntu 14.04,这有什么不同吗?我怎样才能让它工作?

答案1

你是对的,xargs它需要标准输入,因此它正在等待流结束。让它工作的一种方法是通过流程替代, 因为 ...

进程替换是一种重定向形式,其中进程的输入或输出(某些命令序列)作为临时文件出现。

所以你应该尝试:

while IFS= read -r newline; do echo $newline | grep keyword | cat >> filename  ; done < <(tail -f file.log)

从而xargs彻底省去。

相关内容