Frage Wie speichere ich die Terminalausgabe in einer Datei?


Wie speichere ich die Ausgabe eines Befehls in eine Datei?

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


394
2018-02-14 19:49


Ursprung




Antworten:


Ja, es ist möglich, leite die Ausgabe einfach in eine Datei um:

someCommand > someFile.txt  

Oder wenn Sie Daten anhängen möchten:

someCommand >> someFile.txt

wenn du willst stderr benutze das auch:

someCommand &> someFile.txt  

oder das anhängen:

someCommand &>> someFile.txt  

388
2018-02-14 19:52



Beachten Sie, dass someCommand 2> someFile.txt und someCommand 2>> someFile.txt leitet auch um stterr zu someFile.txt - Slothworks
Ich versuche dies mit gcc-Befehl zu tun, aber es funktioniert nicht. Es funktioniert mit anderen Befehlen, aber nicht mit diesem. Es erstellt einfach die Ausgabedatei mit nichts darin. - Nik-Lz
@ Nik-Lz Oft liegt das daran, dass der Befehl seine gesamte Ausgabe an stderr sendet. Wenn gcc Fehlermeldungen generiert, scheint dies wahrscheinlich. In Slothworks-Kommentar finden Sie, wie Sie stderr statt stdout erfassen können. - Jonathan Hartley
NB: um die Ausgabe der make Befehl in eine Datei, es erfordert stattdessen diese Syntax: make > someFile.txt 2>&1 (Quelle: linuxquestions.org/questions/linux-newbie-8/...) - Gabriel Staples
@KyleBridenstrine Siehe die tee Antwort unten (askubuntu.com/a/485762/44179) - Seth♦


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

Überblick:

Bitte beachten Sie, dass die n.e. in der Syntax Spalte bedeutet "nicht vorhanden".
  Es gibt einen Weg, aber es ist zu kompliziert, um in die Säule zu passen. Sie finden einen hilfreichen Link im Listenbereich darüber.

          || 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 Standard-Ausgabestream wird nur in die Datei umgeleitet, er ist im Terminal nicht sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.

  • command >> output.txt

    Der Standard-Ausgabestream 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 an 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 an 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 wird nichts angezeigt. 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 wird nichts angezeigt. Wenn die Datei bereits existiert, werden die neuen Daten an das Ende der Datei angehängt.

  • command | tee output.txt

    Der Standard-Ausgabestream wird in die Datei kopiert, sie ist jedoch weiterhin im Terminal sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.

  • command | tee -a output.txt

    Der Standard-Ausgabestream wird in die Datei kopiert, sie ist jedoch weiterhin im Terminal sichtbar. Wenn die Datei bereits existiert, werden die neuen Daten an das Ende der Datei angehängt.

  • (*)

    Bash hat keine Kurzschriftsyntax, die es ermöglicht, nur StdErr mit einem zweiten Befehl zu verbinden, der hier in Kombination mit benötigt würde tee nochmal um die Tabelle zu vervollständigen. Wenn Sie so etwas wirklich brauchen, schauen Sie sich bitte an "Wie man stderr, und nicht stdout?" auf Stapelüberlauf für einige Wege, wie dies z.B. indem Sie Streams austauschen oder Prozesssubstitution verwenden.

  • command |& tee output.txt

    Sowohl die Standardausgabe als auch die Standardfehlerstreams 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 Standardfehlerstreams 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.


535
2018-02-08 14:52



Danke für den Tisch, es ist exzellent! Dies sollte die beste Antwort sein - DevShark
@ karthick87 Dies hängt nicht wirklich mit der Frage nach dem Umleiten von Ausgaben in eine Datei zusammen, da nur ein Stream in einen anderen umgeleitet wird. 2>&1 Leitet STDERR zu STDOUT um, 1>&2 leitet STDOUT an STDERR und 3>&1 würde Stream 3 zu STDERR umleiten. - Byte Commander
Nur ein Hinweis, dass '| &' auf MacOS nicht funktionierte. Dies liegt daran, dass es eine ältere Version von bash (glaube ich). Die weniger elegante '2> & 1 |' funktioniert aber gut - Danny Parker
was ist mit n, y, y, y? - user1133275
@Jas, um stderr (2) und stdout (1) Streams umzuleiten. - Byte Commander


Sie können auch verwenden tee Senden der Ausgabe an eine Datei:

command | tee ~/outputfile.txt

Eine leichte Änderung wird auch stderr fangen:

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 möchten Erfassen Sie die Befehlsausgabe, während Sie sie auch live betrachten.


81
2018-06-20 04:45



tee ist nützlich, wenn Sie Befehlsausgaben erfassen und gleichzeitig live anzeigen möchten. Mache diese Zeile Fett gedruckt Aaron. Es wird zwei Jobs gleichzeitig erledigen. Danke für die Antwort. - learner
Es besagt, dass das & unerwartet ist und schreibt das Protokoll nicht zur gleichen Zeit wie der Befehl ausgeführt wird. Ich verwende das in einer Bash-Datei, macht das aber einen Unterschied? - tim687
@ tim687 Ich habe diese Änderung entfernt. Tut mir leid, dass ... war nicht ein Teil meiner ursprünglichen Antwort. - Aaron
@Aaron Danke! Tee wird die Datei in Echtzeit anhängen, oder? Ich habe ein Backup-Skript, das ich benutze, lol, backup meinen PC, aber die Protokollierung ist nicht in Echtzeit. Mein PC geht nach dem Backup in den Ruhezustand und die Protokolldatei ist leer. Sollte ich einen anderen Befehl verwenden, um die Befehle zu protokollieren? - tim687
Milliarden Dank, Bruder - Mahesha999


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

17
2018-02-14 19:52



Danke vielmals ! Gibt es irgendwelche Grenzen? wie die maximale Größe der Datei? - led-Zepp
Die maximale Dateigröße ist nur durch das Dateisystem begrenzt - chaos
Diese Antwort speichert stderr nicht. Verwenden Sie &>, siehe stackoverflow.com/questions/637827/... und tldp.org/LDP/abs/html/io-redirection.html - Panther
Das OP hat nie darum gebeten, stderr zu retten - chaos


Eine Verbesserung zu berücksichtigen -

Verschiedene Skripts fügen Farbcodes in die Ausgabe ein, die Sie nicht in Ihrer Protokolldatei auffüllen möchten.

Um das 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

11
2017-07-08 20:57



Wie speichere ich die Ausgabe so, dass Farben erhalten bleiben? Ich möchte das Ergebnis eines Befehls in libreoffice importieren und die Farben beibehalten. - madrang
@madrang: Ich habe jetzt nur deinen Kommentar gelesen, aber du kannst das finden Antworten sinnvoll. - Sylvain Pineau
Oh, fast genau das, wonach ich suche. Wie drucke ich auch auf dem Bildschirm die Ausgabe? - Sigur
Beachten Sie, dass viele Befehle, die kolorierte Ausgabe erzeugen, wie z ls und grep, Unterstützung --color=auto, die nur dann Farbcodes ausgibt, wenn die Standardausgabe ein Terminal ist. - Eliah Kagan


Zum cron Jobs usw. möchten Sie die Bash-Erweiterungen vermeiden. Das entsprechende POSIX sh Umleitungsoperatoren sind

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

Sie werden feststellen, dass die POSIX-Einrichtung in gewisser Weise einfacher und unkomplizierter ist. Das &> Syntax wurde von entlehnt csh was dich schon davon überzeugen sollte, dass es eine schlechte Idee ist.


1
2018-04-11 12:25





some_command | tee command.log und some_command > command.log habe 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 expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

Angenommen log.py enthält:

import time
print('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

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


0
2017-07-04 20:54



Sie speichern die Ausgabe, wie sie es erhalten, das Problem ist, dass Python die Pufferung aktiviert, wenn die Ausgabe nicht auf ein TTY ist. Weitere Optionen zum Deaktivieren in Python: stackoverflow.com/q/107705/2072269 - muru