Вы также можете использовать gawk
(или awk
, если ваши /etc/alternatives/awk
указывает на /usr/bin/gawk
):
ping -c 4 www.google.fr | gawk '{print strftime("%c: ") $0}'
Это похоже на подход в ответе Ачу , но ping
выходные данные передаются gawk
вместо цикла оболочки, который вызывает date
. Как и в случае с этим подходом, он работает без -c
, но если вы не перейдете к остановке ping после n 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
или while
цикл оболочки . Причина в том, что команда на правой стороне канала, а не ping
получает SIGINT при нажатии Ctrl+ C, и ping
не знает, чтобы напечатать статистику до ее завершения.
Если вы работали ping
без -c
левой стороны канала (как показано выше) и хотите завершить его таким образом, чтобы он по-прежнему печатал статистику, тогда вместо нажатия Ctrl+ Cв терминале, где он работает, вы можете запустить с другого терминала, заменив его идентификатором команды. Если вы используете только один экземпляр, вы можете просто использовать .kill -INT PID
PID
ping
ping
killall -INT ping
В качестве альтернативы, вы можете заменить ping
команду на левой стороне канала командой, которая запускает оболочку, сообщает идентификатор процесса этой оболочки, а затем заменяет эту оболочку ping
командой (в результате чего она имеет тот же PID):
sh -c 'echo $$; exec ping www.google.fr' | gawk '{print strftime("%c: ") $0}'
Затем в первой строке вывода будет показан идентификатор процесса ping
команды (который обычно будет отличаться каждый раз). Это будет выглядеть так, но с другим временем и датой и, возможно, с другим идентификатором процесса:
Tue 20 Mar 2018 12:11:13 PM EDT: 7557
Затем из другого терминала можно запустить kill -INT 7557
вместо 7557
действительного идентификатора процесса, который вы видели, чтобы прекратить выполнение ping
команды таким образом, чтобы заставить ее печатать статистику.
(Если вы воспользуетесь функциями управления заданиями своей оболочки , то вы сможете добиться этого и в том же терминале. Но если вы хотите скопировать текст из своего терминала, не удаляя лишнюю часть, где вы выполняли команды в этом терминале, тогда вы должны прекратить ping
с отдельного терминала.)
Дальнейшее чтение: