通过awk进行管道ping并将输出重定向到文件



我的想法是不断地ping地址,提取一些信息,并将其写入文件。

这就是我尝试过的:

$ ping google.com | awk -F' ' '{ time = split($8, arr, "time="); print arr[2] }' > file.log

然后等待几秒钟,然后执行:

$ file file.log
file.log: empty

然而,这可以按预期工作(为ping输出中的每一行打印time=(:

$ ping google.com | awk -F' ' '{ time = split($8, arr, "time="); print arr[2] }'

这也起作用:

$ echo "64 bytes from some.net (x.x.x.x): icmp_seq=7 ttl=115 time=16.7 ms" | awk -F' ' '{ time = split($8, arr, "time="); print arr[2] }' > file.log
$ cat file.log
16.7

这是有效的:

$ ping -c 1 google.com | awk -F' ' '{ time = split($8, arr, "time="); print arr[2] }' > file.log

只有当我继续ping的时候,它才不起作用。我的file.log仍然为空。

如何实现ping不断运行并填充我的file.log

stdout的输出通常是缓冲的——在缓冲区满之前不会写入任何内容。stderr的输出通常会立即写入。

你可以试试:

ping google.com |
awk 'sub("time=","",$8) { print $8 >"/dev/stderr" }' 2>file.log

或:

ping google.com |
awk ' sub("time=","",$8) { print $8; fflush() }' >file.log

相关内容

  • 没有找到相关文章

最新更新