
Ich möchte nur die Anzahl der ms von einem Ping-Befehl in eine Datei erhalten. Ohne Weiterleitung in eine Datei funktioniert es wie vorgesehen. Ich bin ein wenig ratlos, warum > in eine Datei nichts schreibt.
Das funktioniert:
ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g'
Dies schreibt nichts in ping.dat
ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > ping.dat
Was mache ich falsch?
Antwort1
Jeder |
ist möglicherweise von einem stdio-Ausgabepuffer und einem stdin-Eingabepuffer umgeben. Sie müssen herausfinden, welchen davon Sie ausschalten müssen, um Echtzeit-Piping zu erhalten.
Das funktioniert bei mir:
ping localhost |egrep --line-buffered -v 'PING|timeout' |\
stdbuf -o0 sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > file
Ich hatte zunächst stdbuf -i0 -o0
vor jeden Befehl gesetzt und dann herausgefunden, welche unnötig waren.
Antwort2
Wenn Sie GNU verwenden, scheint die -l
Option für sed falsch zu sein: Sie möchten wahrscheinlich die -u
Option (ungepuffert). Außerdem grep
ist die überflüssig. Sie sollten das gewünschte Ergebnis nur mit sed erzielen können:
ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out
Die -n
Unterdrückung der normalen übereinstimmenden Ausgabe erfolgt durch , während die s///p
Ausgabe übereinstimmender Zeilen durch . erzwungen wird.