3

我正在尝试以对数据更友好的格式提取 ping 时间。我的目标是变成这样:

64 bytes from arn06s02-in-f0.1e100.net (173.194.32.32): icmp_seq=59 ttl=54 time=31.8 ms

变成类似的东西:

1361999357 31.8

其中第一个数字来自 $(date +%s),第二个数字是 ping 命令的第 8 列。

我希望能够长时间运行它并获得一个很长的两列时间戳和 ping 时间列表。

时间戳 我的时间戳使用以下内容:

ping google.com | while read line; do echo "$(date +%s) $line"; done

但是当我尝试添加 sed、awk 或 cut 到管道中以获得正好的时间时,我最终没有输出!

我对 sed 或 awk 不是很熟悉,但我确信它们一定是适合这项工作的工具。我的尝试导致没有输出。我认为这是因为 awk 在将输出传递给下一个管道程序之前期待 EOF?

谢谢!

4

3 回答 3

4

使用

$ ping google.com | awk -F'[ =]' 'NR>1{print system("echo -n $(date +%s)"), $11}'

短而高效,不是吗?=)并且没有缓冲问题发生......

注意:system("")可以用作避免缓冲的技巧。

于 2013-02-27T21:39:17.830 回答
1

尝试这个:

ping -c 1 google.com | grep "bytes from" | while read line; do echo "$(date +%s) $line"; done | awk '{print $1 " " $8}' | sed 's,time=,,'

请注意,如果您不使用“-c”,则在获得任何输出之前会发生一定量的缓冲。离开“-c”可以让您更快地查看结果并验证事情是否正常。

于 2013-02-27T21:27:12.257 回答
1

只是为了与众不同...

( date '+%s' ; ping -c 1 google.com; ) | sed -ne '/^[0-9][0-9]*$/h;/ bytes from /{s/^.*time=\([0-9.]*\).*/ \1/;H;g;s/\n//;p;}'

结果:1362002815 7.52

于 2013-02-27T22:09:27.650 回答