Ich versuche, die Anzahl der Ausgabezeilen zu zählen, die ein bestimmtes Programm erzeugt. Das Problem ist, dass die Ausführung des Programms sehr lange dauert und ich die Ausgabe dem Benutzer anzeigen möchte. Gibt es eine Möglichkeit, die Anzahl der Zeilen zu zählen, die der letzte Befehl ausgegeben hat?
Ich könnte tun, program | wc -l
aber das würde dem Benutzer die Ausgabe nicht zeigen. Soweit ich weiß, muss ich das tun program; program | wc -l
- aber das Programm braucht mindestens eine Minute, damit ich es nicht mehr als einmal ausführen muss, nur um die Zeilenanzahl unten anzuzeigen.
BEARBEITEN:
- Gibt es eine Möglichkeit, die Ausgabe während des Vorgangs (zeilenweise) anzuzeigen und am Ende eine Zählung zurückzugeben?
bash
shell
debian
command-line
Libbux
quelle
quelle
STDOUT_WRITE_COUNT
) oder protokollieren Sie ihn am Ende des Programms in einer Datei / API. WDYT?Antworten:
Sie können
tee
den Ausgabestreamwc
aufteilen, indem Sie wie gewohnt eine Kopie an und die andere Kopie an STDOUT senden.Die
>(cmd)
is-bash-Syntax bedeutet,cmd
dass das>(cmd)
Bit ausgeführt und durch den Pfad (eine Named Pipe, mit der es verbunden ist) zum STDIN des Programms ersetzt wird.quelle
>(cmd)
wirdksh
auch erkannt Syntaxzsh
undbash
und wird nur mit Named Pipes auf Systemen, die nicht über/dev/fd/n
.bash
Erfindung ist, da der Wortlaut in Ihrer Antwort einen glauben lassen könnte.sed
und asawk
nur ein Prozess sind. Abertee
undwc
sind beide extrem klein (viel kleiner alssed
undawk
).sed
undawk
. (Ich habedd
100 MB/dev/urandom
in eine Datei geschrieben und diese Datei dann mehrmals durch jede Methode ausgeführt.)Eine Option ist die Verwendung von awk, die das Zählen und Drucken auf stdout ausführen kann.
In
awk
ist NR die aktuelle Zeilennummer. Mit Perl können Sie dasselbe erreichen:Oder
sed
:quelle
Sie können stdout auf stderr klonen.
Auf diese Weise wird
program
die Standardausgabetee
an stderr weitergeleitet, das auf der Konsole gedruckt wird.tee
Schreibt auch die Daten, die an die Standardausgabe weitergeleitet werden, die an die Standardausgabe weitergeleitet wirdwc
.quelle
Meine Lieblingsoption:
quelle
quelle
Das könnte zu spät sein. Aber ich möchte nur Ihre Frage beantworten, wie Sie die gezählte Zahl in einer Variablen abfangen können.
Das ist was du willst
YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
.Wir nutzen den Vorteil,
tee
hier zwei Streams zu generieren und leiten einen an/dev/stderr
, der auf Ihrem Bildschirm erscheint, und den anderen anwc -l
, der die Anzahl der Zeilen angibt.quelle