简而言之:我正在尝试为 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)'