我的想法是不断地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