Ausgabe des Terminals weiter verarbeiten

Mr. Brooks

Lt. Commander
Registriert
Aug. 2011
Beiträge
1.441
Hallo,

ich nutze unter Ubuntu 20.04 Xfce und daher Thunar als Dateimanager. Da habe ich "Benutzerdefinierte Aktionen" (bei KDE sind das glaube ich Service Menüs) eingerichtet die man per Rechtsklick auf eine Datei für diese Datei ausführen kann. Ich starte die mit

lxterminal -e /home/mrbrooks/script %F

Was auch immer da passiert (z. B. eine Videokonvertierung) läuft in einem Terminalfenster, damit ich den Fortschritt des Vorganges erkennen kann. Ich nutze LXTerminal (statt Xfce4-Temrinal) damit sich das ganze vom normalen Terminal optisch abhebt.

Ist es möglich diese sich dynamisch verändernde Ausgabe genau dynamisch weiter zu verarbeiten? Bei einem Videokodierung wird z. B.

frame=29607 fps= 49 q=0.0 size=14586641kB time=00:20:34.02 bitrate=96832.5kbits/
frame=29633 fps= 49 q=0.0 size=14597180kB time=00:20:35.11 bitrate=96817.4kbits/
frame=29665 fps= 49 q=0.0 size=14612860kB time=00:20:36.44 bitrate=96816.7kbits/

ausgegeben. Vorne die aktuelle Frame-Nummer. Man könnte aus dem aktuellen Frame und der Zahl der Gesamtframes den Fortschritt in Prozent errechnen und ausgeben. Ich steht aber auf dem Schlauch wie man das machen könnte, muss ja so lange passieren wie der Vorgang läuft.
 
Versteh ich noch nicht wirklich. Ausgaben in Terminal Fenstern werden von den Programmen erzeugt die auf stdout und stderr schreiben. Du kannst die Ausgaben natürlich entsprechend pipen und per grep, awk und sed etc. rausfiltern was dich interessiert. Für dein Beispiel mit den Frames bräuchte man ja die gesamt Frameanzahl. Die steht dort ja erstmal nicht mit drin.
Für komplexere Parsing Aufgaben würde ich dann einen kleinen Python Wrapper oder so schreiben...
 
Mr. Brooks schrieb:
Ist es möglich diese sich dynamisch verändernde Ausgabe genau dynamisch weiter zu verarbeiten?
Ja :D
Vorne die aktuelle Frame-Nummer. Man könnte…
An der Stelle kommt es sehr darauf an, welche Optionen die von dir verwendeten Programme bieten, in welcher Sprache sie geschrieben wurden, mit welchen Einstellungen kompiliert, usw. usf.

Wenn du sowas vorhast, dann musst du da konkret angeben, welche Programme du verwendest. Die Anzahl der Frames aus Videodateien auslesen könntest du bspw. mit ffprobe, um die 100% zu haben. Allerdings vermute ich, dass du nicht ffmpeg verwendest, da dies von sich aus schon die Möglichkeit einer Fortschrittsanzeige bietet.

Vom grundlegenden Prinzip her kannst du aber alles manipulieren. Beherrschst du schon eine Scriptsprache rudimentär?

Mal als ganz primitives Beispiel mit einem Dringlichkeitsfilter
Bash:
# Terminalemulatorfenster 1
touch /tmp/dakommenmeinedatenrein
tail -f /tmp/dakommenmeinedatenrein | grep Dringlich
Bash:
# Terminalemulatorfenster 2
echo des is net so wichtig >> /tmp/dakommenmeinedatenrein
echo des is klein dringlich >> /tmp/dakommenmeinedatenrein
echo das hier ist echt Dringlich! >> /tmp/dakommenmeinedatenrein

Was hier passiert: Du verfolgst mit dem Programm tail fortlaufend die Änderungen an der Datei. Dies gibt alle Änderungen aus. Durch die Pipe (|) leitest du diese Ausgabe aber um, so dass sie nicht auf stdout landet, sondern im Programm grep, welches die Ausgabe nach dem Wort Dringlich filtert und dann das Ergebnis auf stdout schreibt. tee ist auch so ein nettes Programm, um Dinge irgendwo anzuhängen. Sehr nachtragend ;)

Bei Programmen in Python bspw. bietet es sich auch an das Programm als Bibliothek zu nutzen und dessen Ausgabe dann selbst darzustellen.
In C könntest du schön oldschool die selbe Zeile immer neu schreiben lassen, wie das die Fortschrittsbalken machen.
etc.
 
Bitopium schrieb:
Ausgaben in Terminal Fenstern werden von den Programmen erzeugt die auf stdout und stderr schreiben.

Wie kann ich die Ausgabe der Standardausgabe im Terminal bearbeiten während sie gerade ausgegeben wird? Die Standardausgabe spreche ich mit "1>" an, da wird dann aber in eine Textdatei umgeleitet statt weiterhin auf dem Terminal auszugeben. Ich müsste also anstatt die Ausgabe in eine Datei zu schreiben nochmal mit 'grep' (oder etwas anderem) anpassen. Und hier scheitere ich.

Ich habe diverse kleine Scripte angelegt um Aufgaben zu erledigen, ich kann das nicht auf ein bestimmtes Programm beschränken. Mehr als Shell-Scripte hab ich noch nicht geschrieben.
 
Mr. Brooks schrieb:
Wie kann ich die Ausgabe der Standardausgabe im Terminal bearbeiten während sie gerade ausgegeben wird?
Dafür gibts in Unix/Linux Streams und Pipes. Hier müßtest Du Dich aber vorher mal etwas mit den Konzept vertraut machen. Du kannst jede Textausgabe umlenken und sofort damit weiterverarbeiten. Für das Abgreifen der Felder mußt Du selbst mit cut, awk, printf und Co. sorgen. Die Bash kann aber heute vieles inline viel performanter erledigen.

Jedoch muß man bedenken, daß man - je nach Umleitungen - Daten wegfallen. Daher sind mehrere Zwischenschritte und Umlenkung in temporäre Dateien, auf die man dann weiter aufsetzt, sinnvoll.
 
Zuletzt bearbeitet:
Zurück
Oben