Pipe schreibt nicht in Datei

Pipe schreibt nicht in Datei

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 -o0vor jeden Befehl gesetzt und dann herausgefunden, welche unnötig waren.

Antwort2

Wenn Sie GNU verwenden, scheint die -lOption für sed falsch zu sein: Sie möchten wahrscheinlich die -uOption (ungepuffert). Außerdem grepist 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 -nUnterdrückung der normalen übereinstimmenden Ausgabe erfolgt durch , während die s///pAusgabe übereinstimmender Zeilen durch . erzwungen wird.

verwandte Informationen