繁体   English   中英

将尾部输出重定向到程序中

[英]Redirecting tail output into a program

我想使用tail作为stdin从文本文件中发送程序最新的行。

首先,我向程序回显一些每次都相同的输入,然后从输入文件中发送尾输入,该输入文件应首先通过sed处理。 以下是我期望工作的命令行。 但是当程序运行时,它只接收回声输入,而不是尾部输入。

(echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex' && cat) | ./program

但是,以下工作完全符合预期,将所有内容打印到终端:

echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex' && cat

所以我尝试了另一种类型的输出,并且在发布回声文本的同时,尾部文本没有出现在任何地方:

(echo "new"  && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex') | tee out.txt 

这让我觉得这是一个缓冲问题,但我尝试了unbuffer程序和所有其他建议( https://superuser.com/questions/59497/writing-tail-f-output-to-another-file )结果。 尾部输出在哪里,如何让它按预期进入我的程序?

当我使用以下内容为sed命令添加前缀时解决了缓冲问题:

stdbuf -i0 -o0 -e0 

使用非缓冲更为可取,这对我来说根本不起作用。 Dave M建议使用sed相对较新的-u似乎也可以解决问题。

有一件事你可能会感到困惑 - | (管道)优先于&& (连续执行)。 所以当你说

(echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex' && cat) | ./program

这相当于

(echo "new" && (tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex') && cat) | ./program

所以cat并没有真正做任何事情,而且sed输出可能有点缓冲。 您可以尝试使用-u选项sed使其使用无缓冲输出:

(echo "new" && (tail -f ~/inputfile 2> /dev/null | sed -n -u -r 'some regex')) | ./program

我相信当输出是一个终端时,某些版本的sed默认为-u ,而不是当它是一个管道时,所以这可能是你所看到的差异的来源。

您可以在sed使用i命令(有关详细信息,请参阅联机帮助页中的命令列表)以在开头执行插入:

tail -f inputfile | sed -e '1inew file' -e 's/this/that/' | ./program

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM