问题描述
当我ping时,显示如下:
> ping -i 4 www.google.fr
64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=503 ttl=46 time=45.5 ms
.......
.......
64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=508 ttl=46 time=44.9 ms
64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=509 ttl=46 time=45.1 ms
我想先进行ping操作。
就像是:
> (right functions) + ping -i 7 www.google.fr
mardi 15 mai 2012, 10:29:06 (UTC+0200) - 64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=503 ttl=46 time=45.5 ms
.......
.......
mardi 15 mai 2012, 10:29:13 (UTC+0200) - 64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=508 ttl=46 time=44.9 ms
mardi 15 mai 2012, 10:29:20 (UTC+0200) - 64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=509 ttl=46 time=45.1 ms
您将如何在命令行中执行此操作(如果可能)?
最佳答案
使用:
ping www.google.fr | while read pong; do echo "$(date): $pong"; done
您将得到如下结果:
次佳答案
1.从ping -D
开始的时间
使用ping -D
选项的另一种可能性是将时间戳记作为Unix时间。
tilo@t-ubuntu:~$ ping google.com -D
PING google.com (173.194.33.73) 56(84) bytes of data.
[1388886989.442413] 64 bytes from sea09s15-in-f9.1e100.net (173.194.33.73): icmp_req=1 ttl=57 time=11.1 ms
[1388886990.443845] 64 bytes from sea09s15-in-f9.1e100.net (173.194.33.73): icmp_req=2 ttl=57 time=11.0 ms
[1388886991.445200] 64 bytes from sea09s15-in-f9.1e100.net (173.194.33.73): icmp_req=3 ttl=57 time=10.8 ms
[1388886992.446617] 64 bytes from sea09s15-in-f9.1e100.net (173.194.33.73): icmp_req=4 ttl=57 time=10.9 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 10.860/11.005/11.139/0.123 ms
tilo@t-ubuntu:~$
这是一个awk
cmd,用于将时间戳解析为日期格式:
$ ping -D 10.1.1.1 | awk '{ if(gsub(/\[|\]/, "", $1)) $1=strftime("[%F %T]", $1); print}'
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
[2020-04-10 19:25:08] 64 bytes from 10.1.1.1: icmp_seq=1 ttl=63 time=14.1 ms
[2020-04-10 19:25:09] 64 bytes from 10.1.1.1: icmp_seq=2 ttl=63 time=12.9 ms
[2020-04-10 19:25:10] 64 bytes from 10.1.1.1: icmp_seq=3 ttl=63 time=12.0 ms
^C
PS:awk可能带有管道full-buffered,print
之后的fflush()
将修复:
ping.ts(){
if [ -t 1 ]; then
ping -D "$@" | awk '{ if(gsub(/\[|\]/, "", $1)) $1=strftime("[\033[34m%F %T\033[0m]", $1); print; fflush()}'
else
ping -D "$@" | awk '{ if(gsub(/\[|\]/, "", $1)) $1=strftime("[%F %T]", $1); print; fflush()}'
fi
}
2.从date
开始的时间
这是”Achu”命令的版本,格式略有不同:
ping www.google.com -i 10 -c 3000 | while read pong; do echo "$(date +%Y-%m-%d_%H%M%S): $pong"; done >PingTest_2014-01-04.log
那会让你:
2014-01-04_175748: 64 bytes from sea09s16-in-f19.1e100.net (173.194.33.115): icmp_req=13 ttl=57 time=10.5 ms
第三种答案
有一个名为ts
的实用程序,该实用程序读取stdin,添加时间戳并将其写入stdout:
me@my-laptop:~$ ping localhost | ts
Nov 08 09:15:41 PING localhost (127.0.0.1) 56(84) bytes of data.
Nov 08 09:15:41 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.060 ms
Nov 08 09:15:42 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.098 ms
Nov 08 09:15:43 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.082 ms
Nov 08 09:15:44 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.091 ms
可以使用sudo apt install moreutils
将其安装在Ubuntu中。
第四种答案
您还可以使用gawk
(如果/etc/alternatives/awk
指向/usr/bin/gawk
,则可以使用awk
):
ping -c 4 www.google.fr | gawk '{print strftime("%c: ") $0}'
这类似于Achu’s answer中的方法,但是ping
的输出通过管道传递到gawk
,而不是通过调用date
的Shell循环。与该方法一样,它在没有-c
的情况下也可以使用,但是如果您不通过-c n
在n次ping后停止ping,并且使用Ctrl
+ C
停止循环,则ping
将不会打印通常的统计信息。
ek@Io:~$ ping -c 4 www.google.fr | gawk '{print strftime("%c: ") $0}'
Tue 03 Jan 2017 10:09:51 AM EST: PING www.google.fr (216.58.193.99) 56(84) bytes of data.
Tue 03 Jan 2017 10:09:51 AM EST: 64 bytes from sea15s08-in-f3.1e100.net (216.58.193.99): icmp_seq=1 ttl=51 time=327 ms
Tue 03 Jan 2017 10:09:52 AM EST: 64 bytes from sea15s08-in-f3.1e100.net (216.58.193.99): icmp_seq=2 ttl=51 time=302 ms
Tue 03 Jan 2017 10:09:53 AM EST: 64 bytes from sea15s08-in-f3.1e100.net (216.58.193.99): icmp_seq=3 ttl=51 time=282 ms
Tue 03 Jan 2017 10:09:54 AM EST: 64 bytes from sea15s08-in-f3.1e100.net (216.58.193.99): icmp_seq=4 ttl=51 time=349 ms
Tue 03 Jan 2017 10:09:54 AM EST:
Tue 03 Jan 2017 10:09:54 AM EST: --- www.google.fr ping statistics ---
Tue 03 Jan 2017 10:09:54 AM EST: 4 packets transmitted, 4 received, 0% packet loss, time 3003ms
Tue 03 Jan 2017 10:09:54 AM EST: rtt min/avg/max/mdev = 282.035/315.227/349.166/25.398 ms
ek@Io:~$ ping www.google.fr | gawk '{print strftime("%c: ") $0}'
Tue 03 Jan 2017 10:10:35 AM EST: PING www.google.fr (216.58.193.99) 56(84) bytes of data.
Tue 03 Jan 2017 10:10:35 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=1 ttl=51 time=305 ms
Tue 03 Jan 2017 10:10:35 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=2 ttl=51 time=365 ms
Tue 03 Jan 2017 10:10:36 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=3 ttl=51 time=390 ms
Tue 03 Jan 2017 10:10:38 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=4 ttl=51 time=824 ms
Tue 03 Jan 2017 10:10:38 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=5 ttl=51 time=287 ms
^C
无论ping
的输出是通过管道传递到gawk
还是 shell 程序while
循环,都会发生这种情况。原因是当按下Ctrl
+ C
时,管道右侧的命令而不是ping
会收到SIGINT,并且ping
在终止之前不知道要打印统计信息。
如果您在管道的左侧运行了ping
而没有-c
(如上所示),并且您想要终止它以仍然打印统计信息的方式,那么不要在正在运行的终端中按Ctrl
+ C
,您可以从另一个终端运行kill -INT PID
,并用ping
命令的进程ID替换PID
。如果仅运行ping
的一个实例,则可以简单地使用killall -INT ping
。
或者,您可以替换运行 shell 程序的管道with a command左侧的ping
命令,报告该 shell 程序的进程ID,然后将该 shell 程序替换为ping
命令(以使其具有相同的PID):
sh -c 'echo $$; exec ping www.google.fr' | gawk '{print strftime("%c: ") $0}'
然后输出的第一行将显示ping
命令的进程ID(通常每次都不同)。看起来像这样,但是具有不同的时间和日期,并且可能具有不同的进程ID:
Tue 20 Mar 2018 12:11:13 PM EDT: 7557
然后,可以从另一个终端运行kill -INT 7557
,用看到的实际进程ID替换7557
,以终止ping
命令,使其打印统计信息。
(如果您利用Shell的job control功能,也可以在同一终端中实现此功能。但是,如果您想从终端复制文本而不必删除在该终端中运行命令的任何多余部分,那么您可以应该从另一个终端终止ping
。)
进一步阅读:
-
堆栈溢出时,Alin’s answer至How to derive current date and time and append at the end of each line that contain ‘Hello’。
-
Gawk: Effective AWK Programming中的9.1.5 Time Functions(Gawk的官方参考手册)。
-
man ping
-“发送(或接收)了指定数量的数据包,或者如果该程序以SIGINT终止,则显示简短摘要。”