我正在尝试将活动流通过管道传输到另一个命令(可能是 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
彻底省去。