Ausgabe eines Programmes im Temrinal on-the-fly bearbeiten/filtern?

FatManStanding

Lt. Junior Grade
Registriert
Aug. 2021
Beiträge
385
Hallo,

ich nutze für viele Prozesse Scripte die dann im Terminal laufen. Manche geben schon auf brauchbare Weise eine Art Wasserstandsmeldung aus (welche Datei wird gerade bearbeitet; bei wie viel % ist man usw.), manche machen das nicht oder die Ausgabe ist sehr umfangreich. Gibt es eine Möglichkeit um unabhängig vom Programm den Ausgabetext sozusagen on-the-fly zu filtern? Also das was über die "Standardausgabe" ausgegeben wird? Manche Programme zeigen Zwischenschritte an oder schreiben Teil-Dateien und informieren darüber (oder was weiß ich)

Code:
zwischenschritt1
zwischenschritt2
zwischenschritt3
fertsch

Hier soll nur "fertsch" angezeigt werden. Oder es steht sowas da:

Code:
<dateiname_mit_pfad> <spieldauer_der_datei> <codiere_gerade_sekunde_x> <zu_x_%_fertig>

Dann ist das interessante der Prozentwert und der Dateipfad eher unwichtig. Hier wäre es günstig den Prozentwert an den Anfang zu stellen und den Dateipfad nur auf den Dateinamen zu reduzieren.

Meine Frage zielt nicht darauf ab wie man Zeilen löscht oder einen String manipuliert, sondern wie ich das on-the-fly mit der Standardausgabe mache.
 
Ich habe bisher nur mit sed und grep etwas gemacht, bringt gar nichts und wird einfach ignoriert so als ob ich überhaupt kein sed angehangen hätte. Wenn ich den Ausgabetext des Programmes einfach per echo ausgebe und dann sed hinten gran hänge geht es. Ich vermute die Ausgabe eines Programmes ist "irgendetwas anderes" als ein einfaches echo.
 
Also: die Ausgabe von stdout kann man mit grep und Co.- bearbeiten, die von stderr nicht. Man muss stderr zu stdout umleiten. Für komplexe Sachen ist das aber nicht geeignet. Man müsste die Standard-Ausgabe an ein Script weiterleiten, welches dann komplexere Anpassungen vornimmt und diese ausgibt. Das geht mit

Code:
programm 2>&1 | script

aber nicht. Das Script erwartet ja seinen Input so

Code:
programm 2>&1 | script input

Wie mache ich das hier? Wie leite ich das was vom "programm" als stdout ausgegeben wird als stdin des Scriptes weiter?
 
Zuletzt bearbeitet:
FatManStanding schrieb:
Code:
programm 2>&1 | script input
Wenn die Ausgabe gar nicht über stdx geht, sondern das Programm in eine Logdatei schreibt, dann brauchst du auch keine Pipe, sondern
Code:
programm &  # im Hintergrund weiter laufen lassen
script Logdatei

Wenn das dein eigenes Skript ist, passe es an, sodass es auch mit stdin geht statt einer Datei. Es sind ja die Befehle in dem Skript, die letztlich die Eingabe einlesen. Kannst du uns ein Beispiel zitieren?
 
Das Skript muss stdin/stderr einlesen. So wie hier z.B. beschrieben: stackoverflow
Ansonsten wie oben schon gesagt in ein file reinloggen und das Skript liest aus dem File.
 
OK, dass ich das in das Script packen muss, auf die Idee bin ich nicht gekommen. Geht aber. Ich verstehe aber nicht was das

Code:
set -- ${@:-$(</dev/stdin)}

macht. In meinem Fall geht ein einfaches

Code:
while read line; do
 echo "$line"
done < /dev/stdin
 
Das kann man auch mit einem einfachen "Wagenrücklauf" machen (\r). Dadurch weist man das Terminal an, wieder an den Anfang der Zeile zu springen. Beispiel:

Bash:
# ohne Zeilenumbruch und Wagenrücklauf
echo -n "30%\r";
 sleep 1;
echo -n "60%\r";
sleep 1;
# mit zeilenumbruch
echo "fertisch";

Wichtig wäre dann, dass du die Ausgabe der Programme ausliest und dann selbst steuerst. Das geht dann mit grep, cut und tr ganz gut.


Bash:
# Ausgabe nach leerzeichen trennen und das 4. Wort ausgeben
PROZENT=$(echo "es ist zu 90% fertig" | cut -d " " -f4)
# 90%
echo $PROZENT
 
FatManStanding schrieb:
Ich verstehe aber nicht was das

Code:
set -- ${@:-$(</dev/stdin)}
macht. In meinem Fall geht ein einfaches
${@} gibt alle Argumente des Scopes (also des Skripts oder einer Funktion) aus. ${VARNAME:-Text} ist ein Fallback-Mechanismus: wenn die Variable VARNAME leer ist, wird stattdesen Text eingesetzt. Und set setzt Shell-Optionen. Wenn also nichts als Argument rein kommt, wird stattdessen der Inhalt von /dev/stdin genommen.
 
  • Gefällt mir
Reaktionen: madmax2010 und Pummeluff
STDBUF(1) User Commands STDBUF(1)

NAME
stdbuf - Run COMMAND, with modified buffering operations for its standard streams.

SYNOPSIS
stdbuf OPTION... COMMAND

DESCRIPTION
Run COMMAND, with modified buffering operations for its standard streams.

Mandatory arguments to long options are mandatory for short options too.

-i, --input=MODE
adjust standard input stream buffering

-o, --output=MODE
adjust standard output stream buffering

-e, --error=MODE
adjust standard error stream buffering

--help display this help and exit

--version
output version information and exit

If MODE is 'L' the corresponding stream will be line buffered. This option is invalid with standard input.

If MODE is '0' the corresponding stream will be unbuffered.

Otherwise MODE is a number which may be followed by one of the following: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for
G, T, P, E, Z, Y. Binary prefixes can be used, too: KiB=K, MiB=M, and so on. In this case the corresponding stream will be fully
buffered with the buffer size set to MODE bytes.

NOTE: If COMMAND adjusts the buffering of its standard streams ('tee' does for example) then that will override corresponding
changes by 'stdbuf'. Also some filters (like 'dd' and 'cat' etc.) don't use streams for I/O, and are thus unaffected by 'stdbuf'
settings.

EXAMPLES
tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq
This will immediately display unique entries from access.log

BUGS
On GLIBC platforms, specifying a buffer size, i.e., using fully buffered mode will result in undefined operation.

AUTHOR
Written by Padraig Brady.

REPORTING BUGS
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>

COPYRIGHT
Copyright © 2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

SEE ALSO
Full documentation <https://www.gnu.org/software/coreutils/stdbuf>
or available locally via: info '(coreutils) stdbuf invocation'

GNU coreutils 8.32 September 2020 STDBUF(1)
 
  • Gefällt mir
Reaktionen: madmax2010
Zurück
Oben