立即在每行输出上运行命令

立即在每行输出上运行命令

我发现,当我运行一个命令来执行具有连续输出行的软件(例如 tcpdump 或 tshark 等流量监视器)时,该命令会不断计算屏幕上的数字,例如 4、8、12...等等。

command... | awk -F ' ' '{ANY COMMAND}'

我希望我的 bash 脚本在每一行输出之后执行操作,而不是每数千行执行操作。我怎样才能做到这一点?

有一个很好的例子,当运行一个生成大量输出的软件时,您可以像这样放置管道运算符:

command... | awk -F ' ' '{print $1}'

它将计算从 0 到 1000+ 的数字,然后只打印一次所有正确的信息,但不会在脚本执行时立即打印出来。

如果我使用以下命令将输出放入文件中:

command... > file.txt

...那么当命令提供任何输出时,数据立即存在。我想知道使用管道运算符时导致延迟的原因是什么?

答案1

您可以使用此程序 ( unbiffer) 来停止缓冲程序的输出:

unbuffer command... | awk ......

出现这种“延迟”的原因是 UNIX 和 Linux 中的大部分 I/O 操作都是缓冲区

相关内容