提取ping时间并加上时间戳前缀。

3

我正在尝试以更数据友好的格式提取ping时间。我的目标是将这样的东西转换为:

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

into something like:

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?

谢谢!


awk和sed都进行逐行处理。如果它们不输出,那么你就没有正确处理输入,而且两者认为没有任何要输出的内容。 - Marc B
3个回答

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

短小高效,没错吧?=)而且不会出现缓冲问题...

注意:可以使用system("")作为一种方法来避免缓冲。


实际上,我似乎无法使用> f将输出重定向到文件中。你知道为什么吗? - icz
太好了!这解决了文件的问题。我还刚注意到 'date' 命令没有改变。每次 ping 都给出相同的时间。 - icz
非常感谢!我真的很感激你的时间 :) 你是一个awk天才!谢谢! - icz

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”可以让您更快地看到结果,并验证事物是否正常工作。

这个可以工作!除了awk中的$8需要改成$9以便加入时间戳。如果没有指定-c参数,缓冲区有多大?它已经运行了一段时间..理想情况下,这个脚本应该在每次ping后清空缓冲区。 - icz

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

我需要能够运行ping而不必指定“-c”。但还是谢谢! - icz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接