您也可以使用gawk
(或awk
,如果/etc/alternatives/awk
指向/usr/bin/gawk
):
ping -c 4 www.google.fr | gawk '{print strftime("%c: ") $0}'
这与Achu的答案中的方法类似,但是其ping
输出通过管道传递到gawk
而不是调用的Shell循环date
。与该方法一样,它在不使用的情况下也可以使用-c
,但是如果您在n次 ping 之后没有通过使ping停止,并且使用+ 停止了循环,则不会打印通常的统计信息。-c n
CtrlCping
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
循环,都会发生这种情况。原因是管道的右侧的命令(而不是)在按+时会ping
收到SIGINT,并且在终止之前不知道要打印统计信息。CtrlCping
如果您ping
没有-c
在管道的左侧运行(如上所示),并且希望以仍然打印统计信息的方式终止它,则可以在运行该终端的终端上按Ctrl+ 而不是从另一个终端,替换为命令的进程ID 。如果您仅运行的一个实例,则可以简单地使用。Ckill -INT PID
PID
ping
ping
killall -INT ping
或者,您可以用以下ping
命令替换管道左侧的命令:运行外壳程序,报告该外壳程序的进程ID,然后将该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
,以替换7557
为看到的实际进程ID,以使ping
命令打印统计信息的方式终止该命令。
(如果您利用Shell的作业控制功能,那么您也可以在同一终端中实现此功能。但是,如果您想从终端复制文本而不必删除在该终端中运行命令的任何多余部分,那么您应该ping
从另一个终端终止。)
进一步阅读: