Możesz także użyć gawk
(lub awk
, jeśli /etc/alternatives/awk
wskazuje na to /usr/bin/gawk
):
ping -c 4 www.google.fr | gawk '{print strftime("%c: ") $0}'
Jest to podobne do podejścia zawartego w odpowiedzi Achu , ale ping
dane wyjściowe są przesyłane strumieniowo gawk
zamiast do wywoływanej pętli powłoki date
. Podobnie jak w przypadku tego podejścia, działa bez niego -c
, ale jeśli nie przejdziesz do ping stop po n pingach i zatrzymasz pętlę za pomocą + , nie wydrukuje zwykłych statystyk.-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
Dzieje się tak niezależnie od tego, czy ping
dane wyjściowe są przesyłane do potoku, gawk
czy while
pętli powłoki . Powodem jest to, że polecenie po prawej stronie potoku ping
otrzymuje SIGINT po naciśnięciu Ctrl+ Ci ping
nie wie, aby wydrukować statystyki przed zakończeniem.
Jeśli uruchomiłeś się ping
bez -c
po lewej stronie potoku (jak pokazano powyżej) i chcesz go zakończyć w taki sposób, aby nadal drukował statystyki, to zamiast naciskać Ctrl+ Cw terminalu, na którym działa, możesz uruchomić z innego terminala, zastępując go identyfikatorem procesu polecenia. Jeśli korzystasz tylko z jednej instancji, możesz po prostu użyć .kill -INT PID
PID
ping
ping
killall -INT ping
Alternatywnie można zastąpić ping
polecenie po lewej stronie potoku poleceniem, które uruchamia powłokę, zgłasza identyfikator procesu tej powłoki, a następnie zastępuje tę powłokę ping
poleceniem (powodując, że ma on ten sam PID):
sh -c 'echo $$; exec ping www.google.fr' | gawk '{print strftime("%c: ") $0}'
W pierwszym wierszu wyniku pojawi się identyfikator procesu ping
polecenia (który zwykle będzie inny za każdym razem). Wyglądałoby to tak, ale z inną godziną i datą i prawdopodobnie innym identyfikatorem procesu:
Tue 20 Mar 2018 12:11:13 PM EDT: 7557
Następnie z innego terminala możesz uruchomić kill -INT 7557
, zastępując 7557
rzeczywisty identyfikator procesu, który widziałeś, aby zakończyć ping
polecenie w taki sposób, aby wydrukowało statystyki.
(Jeśli skorzystasz z funkcji kontroli zadań powłoki , możesz to również osiągnąć w tym samym terminalu. Ale jeśli chcesz skopiować tekst z terminala bez konieczności usuwania jakiejkolwiek obcej części, w której uruchomiłeś polecenia w tym terminalu, to powinieneś zakończyć ping
z osobnego terminalu).
Dalsza lektura: