Wie speichere ich die Terminalausgabe in einer Datei?

Wie speichere ich die Ausgabe eines Befehls in einer Datei?

Gibt es einen Weg ohne Software? Ich würde gerne wissen, wie.

Ja, es ist möglich, einfach die Ausgabe umleiten (AKA stdout) in eine Datei:

SomeCommand > SomeFile.txt  

Oder wenn Sie Daten anhängen möchten:

SomeCommand >> SomeFile.txt

Wenn du willst stderr verwenden Sie auch dies:

SomeCommand &> SomeFile.txt  

oder dies zum Anhängen:

SomeCommand &>> SomeFile.txt  

wenn du beides haben willst stderr und ausgabe auf der Konsole angezeigt und in einer Datei verwenden Sie dies:

SomeCommand 2>&1 | tee SomeFile.txt

(Wenn Sie nur die Ausgabe möchten, lassen Sie die 2 oben)

Um die Ausgabe eines Befehls in eine Datei zu schreiben, gibt es grundsätzlich 10 häufig verwendete Methoden.

Überblick:

Bitte beachten Sie, dass die n.e. in der Syntaxspalte bedeutet "nicht vorhanden".
Es gibt einen Weg, aber er ist zu kompliziert, um in die Spalte zu passen. Einen hilfreichen Link dazu finden Sie im Listenteil.

          || visible in terminal ||   visible in file   || existing  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   ==========++==========+==========++==========+==========++===========    >     ||    no    |   yes    ||   yes    |    no    || overwrite    >>    ||    no    |   yes    ||   yes    |    no    ||  append          ||          |          ||          |          ||   2>     ||   yes    |    no    ||    no    |   yes    || overwrite   2>>    ||   yes    |    no    ||    no    |   yes    ||  append          ||          |          ||          |          ||   &>     ||    no    |    no    ||   yes    |   yes    || overwrite   &>>    ||    no    |    no    ||   yes    |   yes    ||  append          ||          |          ||          |          || | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append          ||          |          ||          |          || n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append          ||          |          ||          |          |||& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

Liste:

  • command > output.txt

    Der Standardausgabestream wird nur in die Datei umgeleitet, er ist im Terminal nicht sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.

  • command >> output.txt

    Der Standardausgabestream wird nur in die Datei umgeleitet, er ist im Terminal nicht sichtbar. Wenn die Datei bereits existiert, werden die neuen Daten an das Ende der Datei angehängt.

  • command 2> output.txt

    Der Standardfehlerstrom wird nur in die Datei umgeleitet, er ist im Terminal nicht sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.

  • command 2>> output.txt

    Der Standardfehlerstrom wird nur in die Datei umgeleitet, er ist im Terminal nicht sichtbar. Wenn die Datei bereits existiert, werden die neuen Daten an das Ende der Datei angehängt.

  • command &> output.txt

    Sowohl die Standardausgabe als auch der Standardfehlerstream werden nur in die Datei umgeleitet, im Terminal ist nichts sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.

  • command &>> output.txt

    Sowohl die Standardausgabe als auch der Standardfehlerstream werden nur in die Datei umgeleitet, im Terminal ist nichts sichtbar. Wenn die Datei bereits existiert, werden die neuen Daten an das Ende der Datei angehängt..

  • command | tee output.txt

    Der Standardausgabestream wird in die Datei kopiert, er ist weiterhin im Terminal sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.

  • command | tee -a output.txt

    Der Standardausgabestream wird in die Datei kopiert, er ist weiterhin im Terminal sichtbar. Wenn die Datei bereits existiert, werden die neuen Daten an das Ende der Datei angehängt.

  • (*)

    Bash hat keine Kurzsyntax, die es erlaubt, nur StdErr an einen zweiten Befehl weiterzuleiten, der hier in Kombination mit benötigt würde tee noch einmal, um die Tabelle zu vervollständigen. Wenn Sie so etwas wirklich brauchen, schauen Sie bitte unter "Wie leitet man stderr und nicht stdout?" auf Stapelüberlauf für einige Möglichkeiten, wie dies geschehen kann, z. B. durch Vertauschen von Streams oder durch Prozessersetzung.

  • command |& tee output.txt

    Sowohl die Standardausgabe als auch die Standardfehlerströme werden in die Datei kopiert, während sie im Terminal weiterhin sichtbar sind. Wenn die Datei bereits existiert, wird sie überschrieben.

  • command |& tee -a output.txt

    Sowohl die Standardausgabe als auch die Standardfehlerströme werden in die Datei kopiert, während sie im Terminal weiterhin sichtbar sind. Wenn die Datei bereits existiert, werden die neuen Daten an das Ende der Datei angehängt.

Sie können auch verwenden tee so senden Sie die Ausgabe in eine Datei:

command | tee ~/outputfile.txt

Eine geringfügige Änderung wird auch stderr abfangen:

command 2>&1 | tee ~/outputfile.txt

oder etwas kürzer und weniger kompliziert:

command |& tee ~/outputfile.txt

tee ist nützlich, wenn Sie in der Lage sein wollen erfassen Sie die Befehlsausgabe, während Sie sie auch live anzeigen.

Sie können die Befehlsausgabe in eine Datei umleiten:

your_command >/path/to/file

Um die Befehlsausgabe an eine Datei anzuhängen, anstatt sie zu überschreiben, verwenden Sie:

your_command >>/path/to/file

Eine zu berücksichtigende Verbesserung -

Verschiedene Skripte injizieren Farbcodes in die Ausgabe, die Ihre Protokolldatei möglicherweise nicht überladen sollen.

Um dies zu beheben, können Sie das Programm verwenden sed um diese Codes zu entfernen. Beispiel:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

Hier gibt es zwei verschiedene Fragen. Der erste steht im Titel:

Wie speichere ich die Terminalausgabe in einer Datei?

Die zweite Frage ist im Körper:

Wie speichere ich die Ausgabe eines Befehls in einer Datei?

Alle hier geposteten Antworten befassen sich mit der zweiten Frage, aber keine mit der ersten Frage, die eine großartige Antwort enthält Unix und Linux:

Diese Antwort verwendet einen wenig bekannten Befehl namens script dadurch wird die gesamte Ausgabe Ihrer Shell in einer Textdatei gespeichert, bis Sie eingeben exit. Die Befehlsausgabe erscheint weiterhin auf Ihrem Bildschirm, aber erscheint auch in der Textdatei.

Der Prozess ist einfach. Verwenden:

$ script ~/outputfile.txtScript started, file is /home/rick/outputfile.txt$ command1$ command2$ command3$ exitexitScript done, file is /home/rick/outputfile.txt

Schauen Sie sich dann Ihre aufgezeichnete Ausgabe der Befehle 1, 2 und 3 mit an:

cat ~/outputfile.txt

Dies ist ähnlich wie frühere Antwort von:

command |& tee ~/outputfile.txt
  • Aber Sie müssen nicht verwenden |& tee ~/outputfile.txt nach jedem commnd.
  • Der script befehl hat zusätzlichen Nutzen (oder Nachteil) des Nachladens ~/.bashrc wenn es anfängt.
  • Der script befehl zeigt die Eingabeaufforderung ($PS1) gefolgt von den eingegebenen Befehlen.
  • Der script befehl zeichnet alle Details in Farbe auf.

Für cron jobs usw. möchten Sie die Bash-Erweiterungen vermeiden. Das Äquivalent POSIX sh umleitungsoperatoren sind

Bash          POSIX------------  --------------foo &> bar    foo >bar 2>&1foo &>> bar   foo >>bar 2>&1foo |& bar    foo 2>&1 | bar

Sie werden feststellen, dass die POSIX-Funktion in gewissem Sinne einfacher und unkomplizierter ist. Der &> syntax wurde ausgeliehen von csh was dich schon davon überzeugen sollte, dass es eine schlechte Idee ist.

some_command | tee command.log und some_command > command.log haben das Problem, dass sie die Befehlsausgabe nicht in der command.log datei in Echtzeit.

Um dieses Problem zu vermeiden und die Befehlsausgabe in Echtzeit zu speichern, können Sie anhängen unbuffer, die mit dem kommt expect Paket.


Beispiel:

sudo apt-get install expectunbuffer some_command | tee command.logunbuffer some_command > command.log

Meinen log.py enthalten:

import timeprint('testing')time.sleep(100) # sleeping for 100 seconds

du kannst rennen unbuffer python log.py | tee command.log oder unbuffer python log.py > command.log

Weitere Informationen: Wie kann ich eine Befehlsausgabe in Echtzeit in einer Datei speichern?

Wenn Sie während der Ausführung des Befehls in die Datei ausgeben möchten:

script -c ./path/to/executable.bash -f log.txt