Wie kann ich jedes Ping-Ergebnis mit einem Zeitstempel versehen?

77

Ping gibt dies standardmäßig zurück:

64 bytes from 203.173.50.132: icmp_seq=0 ttl=244 time=57.746 ms

Gibt es eine Möglichkeit, den Zeitstempel hinzuzufügen?

Zum Beispiel,

Mon 21 May 2012 15:15:37 EST | 64 bytes from 203.173.50.132: icmp_seq=0 ttl=244 time=57.746 ms

Ich bin auf OS X 10.7 (Lion), das eine BSD- Version von Ping zu haben scheint .

John Mee
quelle

Antworten:

121

Ich konnte die Perl-basierte Lösung aus irgendeinem Grund nicht in eine Datei umleiten, also suchte ich weiter und fand einen basheinzigen Weg, dies zu tun:

ping www.google.fr | while read pong; do echo "$(date): $pong"; done

Wed Jun 26 13:09:23 CEST 2013: PING www.google.fr (173.194.40.56) 56(84) bytes of data.
Wed Jun 26 13:09:23 CEST 2013: 64 bytes from zrh04s05-in-f24.1e100.net (173.194.40.56): icmp_req=1 ttl=57 time=7.26 ms
Wed Jun 26 13:09:24 CEST 2013: 64 bytes from zrh04s05-in-f24.1e100.net (173.194.40.56): icmp_req=2 ttl=57 time=8.14 ms

Das Guthaben geht an https://askubuntu.com/a/137246

richk
quelle
1
Dies scheint bei Debian-Keuchen nicht zu funktionieren. Bleibt einfach dort ohne Ausgabe bis Strg + C
KBeezie
1
@ KBeezie Nicht sicher, was das Problem in Ihrem Fall war. Ich habe es gerade mit Debian Wheezy versucht und es hat gut funktioniert. Verwenden Sie bashals Shell?
Richk
7
Ich mag diesen Ansatz tatsächlich viel besser, da er weder Perl noch Awk verwendet.
Alexey Kamenskiy
3
Um auch die Timeouts zu sehen, alles , was benötigt wird , ist die Umleitung stderrzu , stdoutbevor das Rohr ( |), etwa so: ping $host 2>&1 | while read pong; do echo "$(date): $pong"; done. Wenn Sie dies in eine Datei schreiben (oder anhängen) möchten, können Sie den gesamten Befehl (nach Abschluss) umleiten. Wenn Sie keine Subshell erzeugen möchten, dateunterstützt der Befehl die echoEingabe beliebiger Eingaben wie folgt : ping $host 2>&1 | while read pong; do date "+%c: $pong"; done. Bitte beachten Sie, dass das formatArgument von date(das mit beginnt +) nach Belieben angepasst werden kann. Siehe man datefür weitere Informationen.
7heo.tk
FWIW, meine Standard-Shell ist ZSH und es hat nicht funktioniert. Als ich es in Bash ausgeführt habe, hat es gut funktioniert. OP erwähnt das im ersten Absatz seines Kommentars ... :)
Levi Figueira
78

Wenn Ihre AWK nicht hat strftime():

ping host | perl -nle 'print scalar(localtime), " ", $_'

Um es in eine Datei umzuleiten, verwenden Sie die Standard-Shell-Umleitung und deaktivieren Sie die Ausgabepufferung:

ping host | perl -nle 'BEGIN {$|++} print scalar(localtime), " ", $_' > outputfile

Wenn Sie das ISO8601-Format für den Zeitstempel wünschen:

ping host | perl -nle 'use Time::Piece; BEGIN {$|++} print localtime->datetime, " ", $_' > outputfile
Bis auf weiteres angehalten.
quelle
obwohl ich den Filter 'Bytes aus' entfernt habe, da ich die Zeitstempel in jeder Zeile haben möchte ... besonders die Zeitüberschreitungen.
John Mee
Funktioniert gut, unterdrückt jedoch STDERR für die Zusammenfassungsergebnisse am Ende, wenn Sie Strg + C drücken. Das gleiche Problem besteht für die BASH-Antwort.
Nicholas Blasgen
1
@NicholasBlasgen: Das liegt daran, dass die Strg-C zum letzten Prozess in der Pipe geht und der pingeinzige eine erhält SIGPIPE. Sie können die Prozessersetzung anstelle einer Pipe verwenden: ping host > >(perl -nle 'print scalar(localtime), " ", $_')und die Strg-C-Taste wechselt zu pingund führt das aus, was Sie möchten. Sie können dasselbe mit der whileSchleife tun . Übrigens geht auf meinem System die Zusammenfassung STDOUTeher zu als STDERR(also wird sie auch mit einem Zeitstempel versehen).
Bis auf weiteres angehalten.
Diese Antwort wäre meiner Meinung nach viel besser, wenn das Datum / Uhrzeit-Format ISO8601 wäre.
Phrogz
@Phrogz: Ich stimme zu, dass dies ein wünschenswerteres Format ist, aber meine Antwort entspricht fast der des OP (je nach Gebietsschema). Um das ISO8601-Format zu erhalten, können Sie use Time::Piece; print localtime->datetime(und andere geeignete Einstellungen) mit 5.10 beginnen oder ein CPAN-Modul oder verwenden strftime.
Bis auf weiteres angehalten.
30

Von man ping:

   -D     Print timestamp (unix time + microseconds as in gettimeofday) before each line.

Es wird so etwas produzieren:

[1337577886.346622] 64 bytes from 4.2.2.2: icmp_req=1 ttl=243 time=47.1 ms

Dann könnte der Zeitstempel aus der pingAntwort heraus analysiert und mit in das erforderliche Format konvertiert werden date.

ДМИТРИЙ МАЛИКОВ
quelle
2
Es tut uns leid. ADSL fiel aus, als ich Tags hinzufügte ... es ist OSX Lion - hat keine "-D" -Option :-(
John Mee
Jemand, der gut mit Perl und Regex umgehen kann, könnte dies so formatieren, dass es auf ein von Menschen lesbares Datum und eine lesbare Uhrzeit formatiert wird =]
Cleber Reizen
15
  1. Terminalausgang:

    ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}'

  2. Dateiausgabe:

    ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}' > test.txt

  3. Terminal + Dateiausgabe:

    ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}' | tee test.txt

  4. Hintergrund der Dateiausgabe:

    nohup ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}' > test.txt &

Xuanyuanaosheng
quelle
10

Unter OS X können Sie einfach die Option --apple-time verwenden:

ping -i 2 --apple-time www.apple.com

Erzeugt Ergebnisse wie:

10:09:55.691216 64 bytes from 72.246.225.209: icmp_seq=0 ttl=60 time=34.388 ms
10:09:57.687282 64 bytes from 72.246.225.209: icmp_seq=1 ttl=60 time=25.319 ms
10:09:59.729998 64 bytes from 72.246.225.209: icmp_seq=2 ttl=60 time=64.097 ms
Nicolas Graubünden
quelle
8

Meine ursprüngliche Einreichung war falsch, da das Datum nicht für jede Zeile ausgewertet wurde. Korrekturen wurden vorgenommen.

Versuche dies

 ping google.com | xargs -L 1 -I '{}' date '+%+: {}'

erzeugt die folgende Ausgabe

Thu Aug 15 10:13:59 PDT 2013: PING google.com (74.125.239.103): 56 data bytes
Thu Aug 15 10:13:59 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=0 ttl=55 time=14.983 ms
Thu Aug 15 10:14:00 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=1 ttl=55 time=17.340 ms
Thu Aug 15 10:14:01 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=2 ttl=55 time=15.898 ms
Thu Aug 15 10:14:02 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=3 ttl=55 time=15.720 ms
Thu Aug 15 10:14:03 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=4 ttl=55 time=16.899 ms
Thu Aug 15 10:14:04 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=5 ttl=55 time=16.242 ms
Thu Aug 15 10:14:05 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=6 ttl=55 time=16.574 ms

Die Option -L 1 bewirkt, dass xargs jeweils eine Zeile anstelle von Wörtern verarbeitet.

Bromo
quelle
Druckt nicht während der Zeiträume "Zeitüberschreitung anfordern". speichert sie alle und sie werden mit demselben Zeitstempel ausgegeben, wenn die Zeitüberschreitungen für Anforderungen aufhören.
David Eison
@ DavidEison versuchenping -D -n -O -i1 -W1 8.8.8.8
Thomas Szteliga
5

Versuche dies:

ping www.google.com | while read endlooop; do echo "$(date): $endlooop"; done

Es gibt so etwas zurück wie:

Wednesday 18 January  09:29:20 AEDT 2017: PING www.google.com (216.58.199.36) 56(84) bytes of data.
Wednesday 18 January  09:29:20 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=1 ttl=57 time=2.86 ms
Wednesday 18 January  09:29:21 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=2 ttl=57 time=2.64 ms
Wednesday 18 January  09:29:22 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=3 ttl=57 time=2.76 ms
Wednesday 18 January  09:29:23 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=4 ttl=57 time=1.87 ms
Wednesday 18 January  09:29:24 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=5 ttl=57 time=2.45 ms
Nutria
quelle
5

Auf Macos können Sie tun

ping --apple-time 127.0.0.1

Die Ausgabe sieht aus wie

16:07:11.315419 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.064 ms
16:07:12.319933 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.157 ms
16:07:13.322766 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.066 ms
16:07:14.324649 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.148 ms
16:07:15.328743 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.092 ms
Clintm
quelle
3

Leiten Sie das Ergebnis an awk:

 ping host | awk '{if($0 ~ /bytes from/){print strftime()"|"$0}else print}'
Prinz John Wesley
quelle
hat versprochen! mag die strftime nicht, also arbeite ich daran
John Mee
Überprüfen Sie diesen Code mit einem nicht vorhandenen Host oder wenn das Netz
ausgefallen
1

Sie haben keinen Zeitstempel oder kein Intervall angegeben, wie lange Sie eine solche Ausgabe benötigen würden, daher habe ich sie als Endlosschleife betrachtet. Sie können es entsprechend Ihren Anforderungen ändern.

while true
do
   echo -e "`date`|`ping -n -c 1 <IP_TO_PING>|grep 'bytes from'`"
   sleep 2
done
Venkat Madhav
quelle
Sie sollten das grepTeil auf `egrep '(bytes from|errors)'
rubo77
@ rubo77 Kannst du erklären, warum 'egrep' anstelle von 'grep' verwendet wird
Venkat Madhav
egrep nur, um einen regulären Ausdruck hinzuzufügen, um auch eine Ausgabe für Fehler zu erhalten
rubo77
1
ping -D -n -O -i1 -W1 8.8.8.8

oder vielleicht

while true; do \
    ping -n -w1 -W1 -c1 8.8.8.8 \
    | grep -E "rtt|100%" \
    | sed -e "s/^/`date` /g"; \
    sleep 1; \
done
Thomas Szteliga
quelle
1

Ich benötige dies auch, um das Netzwerkproblem auf mein Problem mit dem Zeitlimit für die Datenbankspiegelung zu überwachen. Ich benutze den Befehlscode wie folgt:

ping -t Google.com|cmd /q /v /c "(pause&pause)>nul & for /l %a in () do (set /p "data=" && echo(!date! !time! !data!)&ping -n 2 Google.com>nul" >C:\pingtest.txt

Sie müssen nur Google.com an Ihren Servernamen ändern. Es funktioniert perfekt für mich. und denken Sie daran, dies zu beenden, wenn Sie fertig sind. Die Datei pingtest.txt wird um 1 KB pro Sekunde (ungefähr) erhöht.

Vielen Dank für raymond.cc. https://www.raymond.cc/blog/timestamp-ping-with-hrping/

DBALUKE HUANG
quelle
Update: Die Datei pingtest.txt wird um ca. 4,5 KB pro Minute erhöht.
DBALUKE HUANG
0

Versuchen Sie diese Linie.

while sleep 1;do echo "$(date +%d-%m-%y-%T) $(ping -c 1 whatever.com | gawk 'FNR==2{print "Response from:",$4,$8}')" | tee -a /yourfolder/pingtest.log;done

Sie müssen es mit ctrl-ctho stornieren .

nDCasT
quelle
Gute Idee mit zu verwenden tee, aber das Problem -c 1ist, die Gesamtstatistik zu verlieren ...
minusf
0

Sie können eine Funktion in Ihrer ~/.bashrcDatei erstellen, sodass Sie einen Ping-Befehl ping-tauf Ihrer Konsole erhalten:

function ping-t { ping "$1" | while read pong; do echo "$(date): $pong"; done; }

Jetzt können Sie dies auf der Konsole aufrufen:

ping-t example.com

Sa 31. Mär 12:58:31 MESZ 2018: PING example.com (93.184.216.34) 56 (84) Datenbytes.
Sa 31. Mär 12:58:31 MESZ 2018: 64 Bytes von 93.184.216.34 (93.184.216.34): icmp_seq = 1 ttl = 48 Zeit = 208 ms
Sa 31. Mär 12:58:32 MESZ 2018: 64 Bytes von 93.184 .216.34 (93.184.216.34): icmp_seq = 2 ttl = 48 time = 233 ms

rubo77
quelle