Wie kann die Anzahl der von einem Befehl ausgegebenen Zeilen in Echtzeit angezeigt werden?

Wie kann die Anzahl der von einem Befehl ausgegebenen Zeilen in Echtzeit angezeigt werden?

Ich verwende es svn exportals Teil eines Packager-Skripts für meine Anwendung und es sieht so aus, als ob dieser Befehl, wie viele andere auch, keinerlei Fortschrittsbalken hat.

Ich habe im Moment zwei Möglichkeiten:

  • Verwenden Sie es ohne Optionen und sehen Sie zu, wie es Tausende von Zeilen druckt
  • verwenden --quietund nichts sehen, bis es abgeschlossen ist.

Gibt es eine Möglichkeit, zumindest die Anzahl der vom Befehl ausgegebenen Zeilen in Echtzeit anzuzeigen? Zum Beispiel:

Exporting SVN directory ... 1234 files

Und sehen Sie diese Nummer1234 Inkrement in Echtzeit? Ich kann mir vorstellen, die Ausgabe an einen Befehl weiterzuleiten, der genau dies tut, aber an welchen?

Antwort1

yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

Oder fügen Sie den eingeklammerten Abschnitt in ein Shell-Skript ein. Beachten Sie, dass dies nur funktioniert, wenn Ihre Shell den Präinkrementoperator tatsächlich unterstützt, wie z. B. Bash oder Ksh93 oder Zsh. Andernfalls müssen Sie inkrementieren $Iund dann drucken (wie in I=$((I+1));printf...). Wenn printfes in Ihrer Shell nicht integriert ist (es ist in der aktuellen Bash integriert), können Sie stattdessen echo -neoder verwenden print -n, um eine bessere Leistung zu erzielen. Sie möchten nur die neue Zeile unterdrücken und \r als Escape-Zeichen interpretieren lassen.

Antwort2

Dies ist nur eine grobe Vorstellung, aber Sie könnten den pvBefehl verwenden, um die Anzahl der vorbeilaufenden Zeilen zu zählen und dies auf dem Bildschirm anzuzeigen. pvUnter den vielen Schaltern befindet sich einer -l, der jede durchlaufende Zeile zählt.

Beispiel

Hier verwende ich eine While-Schleife, um einige Dateien aus Ihrer SVN-Ausgabe zu simulieren.

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

Die Ausgabezeile wird weiterhin wie folgt überschrieben:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

Antwort3

Sie können Ihren Befehl als Job im Hintergrund ausführen und seine Standardausgabe (und optional auch die Standardfehlerausgabe) in eine Protokolldatei umleiten: command > logfile &wobei &„Job“ bezeichnet (wenn auch die Standardfehlerausgabe, sagen Sie „ &>anstelle von >“).

Anschließend können Sie das Dienstprogramm „Wordcount“ verwenden, um die Anzahl der Zeilen in Ihrer Protokolldatei zu zählen wc -l.

Um die Statusänderung in einer sich dynamisch ändernden Zeile anzuzeigen, könnten Sie etwas wie verwenden while true; do echo -en '\r'; wc -l logfile; sleep 1; done, aber ich kann Bash nicht zwingen, \reinen Wagenrücklauf anzuzeigen, um den Inhalt der vorherigen Zeile zu löschen.

Sehen Sie sich diese Frage an, es ist fast ein Duplikat:https://stackoverflow.com/questions/2388090/wie-lösche-und-ersetze-man-die-letzte-zeile-im-terminal-mit-bash

verwandte Informationen