我发现,当我运行一个命令来执行具有连续输出行的软件(例如 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 操作都是缓冲区