gpt4 book ai didi

linux - 通过管道传输到 awk 的 Bash 命令有时会被缓冲

转载 作者:太空狗 更新时间:2023-10-29 11:06:55 25 4
gpt4 key购买 nike

系统:Linux 4.13.0-43-generic#48~16.04.1-UbuntuBASH_VERSION='4.3.48(1)-release'

命令:

while sleep 5
do
date +%T
done | awk -F: '{print $3}'

应该打印“日期”输出的第三个字段(秒),每 5 秒一行。问题:只有当管道的缓冲区已满时,awk 才会从管道读取并处理其输入。即当生成超过 4K 的输入时。

awk 替换为 cat 时,按预期每 5 秒打印一行。

这段代码是从一个在其他系统上运行良好的shell脚本简化而来的,所以在这个系统中一定有关于bash、awk和它们的配置的东西。

简而言之,有没有办法让 awk 在从管道读取时表现得像 cat

@Ed Morton:我确实尝试在每次打印后添加 fflush(),但它不起作用——这表明问题出在 awk 的输入上,而不是输出上。我还尝试添加对 system("date") 的调用,这表明 awk 确实一次获取所有输入行,而不是在它们生成时立即获取。

对于那些提问的人:

$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF 32767
sprintf buffer 2040

最佳答案

在尝试找出如何使 awk 打印其版本时,我发现它确实是 mawk,并且它具有以下标志:

 -W interactive -- sets unbuffered writes to stdout and line buffered reads from stdin.
Records from stdin are lines regardless of the value of RS.

这似乎解决了问题!

感谢所有回复者。

关于linux - 通过管道传输到 awk 的 Bash 命令有时会被缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50723480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com