各个部件都能正常工作,但通过它们传输数据会破坏它

各个部件都能正常工作,但通过它们传输数据会破坏它

简而言之:我正在尝试为 ping 构建另一个输出,它更适合我尝试做的一些事情。为此,我将 ping 输出通过管道传输到 sed,以删除除所用毫秒数之外的所有内容。最后一部分是用 python 编写的,它创建了输出。以下是代码:

ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//' | python3 -c 'while True:
    l = [float(input()) for _ in range(10)]
    m = sum(l) / len(l)
    n = sum(abs(i - m) for i in l) / len(l)
    print("{}\t{}".format(m, n))'

我尝试在 fish 和 bash 中运行它,但它不起作用(=> 我没有得到任何输出)。但是,各个部分都可以工作,并ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//'产生预期的输出。如果我使用 cat 将文件导入 python 脚本,则会产生预期的输出。

答案1

通常,如果观察到此类行为(无输出或延迟输出),则是由于管道缓冲造成的。如果您sed使用标志指示“取消缓冲”,则命令在此处有效-u

stdbuf您可以使用程序更改单个程序的缓冲行为coreutils,例如使用行缓冲:

stdbuf -oL sed '...'

顺便说一句,如果你的版本grep支持 Perl 正则表达式,你可以使用前瞻模式实现相同的效果,例如:

grep --line-buffered -oP '[0-9.]+(?= ms)'

相关内容