ubuntuusers.de

sed real time Zeile mit Datum versehen

Status: Gelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

jb-alvarado

Anmeldungsdatum:
28. November 2012

Beiträge: 345

Hallo Allerseits,

ich habe hier einen Video Livestream der über ffmpeg gestreamt wird. Mit tee splitte ich den Prozess Log, so dass er im Terminal und in einem Logfile geschrieben wird. Das Logfile kann anschließend über eine PHP Seite im Browser angezeigt werden.

Mein ursprünglicher Befehl sah so aus:

1
2
3
4
5
ffmpeg -v info -hide_banner "${input[@]}" \
	-vf scale=$res -sws_flags bicubic+accurate_rnd+full_chroma_int -r 25 -pix_fmt yuv420p -c:v libx264 -crf 21 -g 25 \
	-maxrate $maxR -bufsize $maxR -preset slower -profile:v Main -level 3.1 -refs 3 -c:a libfdk_aac -b:a $audR -ar 44100 \
    -nostdin -movflags rtphint -threads 0 -f flv "$fftarget" 2>&1 \
	| tee >( grep -Ev --line-buffered "264 - core|frame=" - >> /home/user/fflog/ffreport_$dT.log )

Das hat soweit funktioniert, also ich konnte in PHP das Logfile einlesen, während der ffmpeg Prozess läuft.

Nun würde ich gerne per sed bestimmte Zeile bearbeiten und am Anfang ein Datum einfügen. Leider bekomme ich es nicht hin, dass das in real time stattfindet. Erst wenn ich den Prozess beende ist das Logfile befüllt. Zusätzlich wird das Datum und die Uhrzeit vom Scriptstart an die Zeilen eingefügt und nicht die tatsächlichen.

Geht mein Vorhaben so? Und habt ihr eine Idee wie?

Hier wäre mein Ansatz gewesen:

1
2
3
4
5
ffmpeg -v info -hide_banner "${input[@]}" \
	-vf scale=$res -sws_flags bicubic+accurate_rnd+full_chroma_int -r 25 -pix_fmt yuv420p -c:v libx264 -crf 21 -g 25 \
	-maxrate $maxR -bufsize $maxR -preset slower -profile:v Main -level 3.1 -refs 3 -c:a libfdk_aac -b:a $audR -ar 44100 \
    -nostdin -movflags rtphint -threads 0 -f flv "$fftarget" 2>&1 \
	| tee >( grep -Ev --line-buffered "264 - core|frame=" - | sed "s/^\[mp/$(date +"%Y-%m-%d %T") \[mp/g;s/^Error/$(date +"%Y-%m-%d %T") Error/g" >> /home/user/fflog/ffreport_$dT.log )

Grüße

Jonathan

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

In

sed "s/^\[mp/$(date +"%Y-%m-%d %T")

wird schlichtweg date nur einmal zu Beginn aufgerufen und das Ergebnis dann immer wieder weiterverwendet. Was du wölltest, wäre vermutlich sowas wie der e-Befehl (der afaik eine GNU-Erweiterung von sed ist).

Generell ist dein Vorhaben mit sed aber nur „umständlich“ lösbar. Vielleicht kannst du ja auch awk benutzen:

i=0; while sleep 0.25; do echo $i $((RANDOM)); ((i++)); done |
awk '{ print "[" strftime("%F %T") "] " $0 }'

(Falls unklar/ungewohnt: Das ist ein Befehl, der sich über zwei Zeilen erstreckt. Und die while-Schleife vorne soll nur irgendwelche Testausgaben erzeugen.)

Dann hast du noch das Problem mit „Ausgabe ist nicht live“. Bei sed gäbe es hier tatsächlich direkt den Switch „-u“, der den Ausgabepuffer „häufiger“ flusht. awk hat, soweit ich weiß, so einen Switch nicht. Du könntest dir hier mit stdbuf behelfen:

i=0; while sleep 0.25; do echo $i $((RANDOM)); ((i++)); done |
stdbuf -o0 awk '{ print "[" strftime("%F %T") "] " $0 }' >test.log

Das Problem zeigt sich nur bei Umleitung in eine Datei, weil stdout auf ein Terminal normalerweise zeilengepuffert ist.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ja. wenn es echt "Real Time" sein soll, würde ich auch an awk denken.

Und Gnu- awk kann sehr wohl seinen Buffer auf Zuruf flushen, mit dem Befehl ... na ? - ja, natürlich mit fflush() 😉

LG,

track

jb-alvarado

(Themenstarter)

Anmeldungsdatum:
28. November 2012

Beiträge: 345

Ich danke euch beiden! Komisch, dass ich gawk extra nachinstallieren muss... Habs noch nicht live getestet aber denke das meiste habe ich:

1
awk '{ if ( $0 ~ /^\[mp/ || $0 ~ /^Error/ ) print "[" strftime("%F %T") "] " $0; else if ($0 !~ /^frame=/ && 0$ !~ /264 - core/ ) print; fflush() }'

Hänge noch am letzten: "&& 0$ !~ /264 - core/" Da mag er das !~ nicht mehr übernehmen. Gibt es da eine Mengenlimitierung? Ist auch nicht so tragisch, kann auch weg bleiben - ist nur kosmetischer Natur.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Jaja, das mit dem fehlenden gawk ist sehr ärgerlich, aber bekannt.

Und nee, eine Mengenbegrenzung gibt es da ganz sicher nicht.
Aber awk ist manchmal etwas eigen hinsichlich des Klammerns. Versuch mal die logischen Ausdrücke ausdrücklich zu klammern:

else if (( $0 !~ /^frame=/ ) && ( 0$ !~ /264 - core/ ))

LG,

track

Antworten |