Wie speichere ich Terminalausgaben in einer Datei?

695

Wie speichere ich die Ausgabe eines Befehls in einer Datei?

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

LED-Zepp
quelle

Antworten:

743

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

SomeCommand > SomeFile.txt  

Oder wenn Sie Daten anhängen möchten:

SomeCommand >> SomeFile.txt

Wenn du das stderrauch nutzen willst :

SomeCommand &> SomeFile.txt  

oder dies anhängen:

SomeCommand &>> SomeFile.txt  

Wenn Sie beide stderrund die Ausgabe auf der Konsole und in einer Datei anzeigen lassen möchten, gehen Sie wie folgt vor :

SomeCommand 2>&1 | tee SomeFile.txt

(Wenn Sie nur die Ausgabe möchten, löschen Sie die 2oben genannten)

Seth
quelle
15
Beachten Sie, dass someCommand 2> someFile.txtund someCommand 2>> someFile.txtleitet auch stterrzu someFile.txt
Slothworks
Ich versuche dies mit dem Befehl gcc zu tun, aber es funktioniert nicht. Es funktioniert mit anderen Befehlen, aber nicht mit diesem. Es wird einfach die Ausgabedatei erstellt, in der sich nichts befindet.
Nikos
@ Nik-Lz Oft liegt das daran, dass der Befehl alle seine Ausgaben auf stderr sendet. Wenn gcc Fehlermeldungen generiert, ist dies wahrscheinlich. Unter Slothworks-Kommentar finden Sie Informationen zum Erfassen von stderr anstelle von stdout.
Jonathan Hartley
1
NB: Um die Ausgabe des makeBefehls in eine Datei zu bekommen, muss stattdessen diese Syntax verwendet werden: make > someFile.txt 2>&1(Quelle: linuxquestions.org/questions/linux-newbie-8/… )
Gabriel Staples
Ich habe ein Problem, dass es aufhört zu schreiben, wenn die Datei ungefähr 8MB erreicht. Ist das eine bekannte Grenze?
RelG
874

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

Überblick:

Bitte beachten Sie, dass n.e.in der Syntaxspalte "nicht vorhanden" steht.
Es gibt einen Weg, aber es ist zu kompliziert, um in die Säule zu passen. Einen hilfreichen Link finden Sie im Abschnitt Liste.

          || 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 und ist im Terminal nicht sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.

  • command >> output.txt

    Der Standardausgabestream wird nur in die Datei umgeleitet und ist im Terminal nicht sichtbar. Wenn die Datei bereits vorhanden ist, 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 vorhanden ist, werden die neuen Daten an das Ende der Datei angehängt.

  • command &> output.txt

    Sowohl die Standardausgabe als auch der Standardfehlerstrom 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 Standardfehlerstrom 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 und ist im Terminal weiterhin sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.

  • command | tee -a output.txt

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

  • (*)

    Bash hat keine Kurzschrift-Syntax, die es erlaubt, nur StdErr an einen zweiten Befehl weiterzuleiten, der hier in Kombination mit teeagain zur Vervollständigung der Tabelle benötigt würde. Wenn Sie so etwas wirklich brauchen, schauen Sie bitte unter "So leiten Sie stderr und nicht stdout?" on Stack Overflow für einige Möglichkeiten, wie dies getan werden kann, z. B. durch Austauschen von Streams oder durch Ersetzen von Prozessen.

  • 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 vorhanden ist, werden die neuen Daten an das Ende der Datei angehängt.

Byte Commander
quelle
66
Vielen Dank für den Tisch, es ist ausgezeichnet! Dies sollte die beste Antwort sein
DevShark
3
@ karthick87 Das hat nicht wirklich mit der Frage zu tun, wie die Ausgabe in eine Datei umgeleitet wird, da nur ein Stream in einen anderen umgeleitet wird. 2>&1Leitet STDERR zu STDOUT um, 1>&2leitet STDOUT zu STDERR um und 3>&1leitet Stream 3 zu STDERR um.
Byte Commander
18
Nur eine Notiz, dass '| &' unter macOS nicht funktioniert hat. Das liegt daran, dass es eine ältere Version von bash gibt (glaube ich). Das weniger elegante '2> & 1 |' funktioniert aber gut
Danny Parker
2
@ByteCommander Ich erhalte die Fehlermeldung: sh: 1: Syntax error: "&" unexpectedwenn ich |& teeein Python-Skript auf einem c9.io-Server verwende. Es scheint, dass eine andere Shell verwendet wird. echo $SHELLzeigt /bin/bashund $SHELL --versionzeigt Version 4.3.11 (1) -Release. Ich habe es #!/bin/bashin meinem Python-Skript versucht, aber ich verstehe immer noch sh: 1: Syntax error. Ich habe das, was ich brauchte, also gebe ich es auf, die Verrücktheit zwischen shund bashauf meinem Server zu sortieren . Vielen Dank.
samkhan13
1
@ samkhan13 sieht aus wie du rennst shund nicht bash(oder vielleicht bashim shModus ...). Sie können überprüfen, was genau Ihr aktueller Shell-Prozess verwendet ps -p $$ -o cmd=, da er echo $SHELLunzuverlässig ist und Ihnen Ihre Anmeldeshell anzeigt. Dabei können Sie ignorieren, ob Sie möglicherweise eine andere Subshell gestartet haben.
Byte Commander
108

Sie können auch verwenden tee, um die Ausgabe an eine Datei zu senden:

command | tee ~/outputfile.txt

Eine kleine Modifikation wird auch stderr einfangen:

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

oder etwas kürzer und weniger kompliziert:

command |& tee ~/outputfile.txt

teeDies ist nützlich, wenn Sie die Befehlsausgabe erfassen und gleichzeitig live anzeigen möchten .

Aaron
quelle
Es heißt, dass das & unerwartet ist und das Protokoll nicht gleichzeitig mit der Ausführung des Befehls geschrieben wird. Ich verwende dies jedoch in einer Bash-Datei. Macht das einen Unterschied?
Tim687
@ tim687 Ich habe diese Bearbeitung entfernt. Entschuldigung ... war nicht Teil meiner ursprünglichen Antwort.
Aaron
@ Aaron Danke! Tee wird die Datei in Echtzeit anhängen, oder? Ich habe ein Sicherungsskript, mit dem ich meinen PC sichern kann, aber die Protokollierung erfolgt nicht in Echtzeit. Mein PC geht in den Ruhezustand, nachdem die Sicherung abgeschlossen ist und die Protokolldatei leer ist. Sollte ich einen anderen Befehl verwenden, um die Befehle zu protokollieren?
Tim687
Wie interpretiere ich die Bedeutung von 2>&1?
Mahesha999
@ Mahesha999 2 ist der Dateideskriptor für STDERR und 1 für STDOUT. Damit 2> & 1 STDERR an STDOUT sendet. Diese SO-Frage erklärt es ziemlich gut: stackoverflow.com/questions/818255/…
Aaron
20

Sie können die Befehlsausgabe in eine Datei umleiten:

your_command >/path/to/file

Verwenden Sie Folgendes, um die Befehlsausgabe an eine Datei anzuhängen, anstatt sie zu überschreiben:

your_command >>/path/to/file
Chaos
quelle
Danke vielmals ! Gibt es irgendwelche Grenzen? wie die maximale Größe der Datei?
Led-Zepp
3
Die maximale Dateigröße ist nur durch das Dateisystem begrenzt
Chaos
Diese Antwort wird stderr nicht retten. Verwenden Sie &>, siehe stackoverflow.com/questions/637827/… und tldp.org/LDP/abs/html/io-redirection.html
Panther
3
Die OP fragte nie stderr zu retten
Chaos
Es heißt "Keine solche Datei oder Verzeichnis". Ist es möglich, die Verzeichnisse auch automatisch anzulegen?
Qwerty
14

Eine zu berücksichtigende Verbesserung -

Verschiedene Skripte fügen Farbcodes in die Ausgabe ein, damit Ihre Protokolldatei nicht überladen wird.

Um dies zu beheben, können Sie das Programm sed verwenden , 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
Sean Huber
quelle
1
Wie speichere ich die Ausgabe so, dass die Farben erhalten bleiben? Ich möchte das Ergebnis eines Befehls in libreoffice importieren und die Farben behalten.
Madrang
@madrang: Ich lese jetzt nur Ihren Kommentar, aber Sie finden diese Antwort möglicherweise hilfreich.
Sylvain Pineau
Oh, fast genau das, wonach ich suche. Wie drucke ich die Ausgabe auch auf dem Bildschirm?
Sigur
1
Beachten Sie, dass viele Befehle, die eine farbige Ausgabe erzeugen, wie z. B. lsund , diese nur dann grepunterstützen --color=auto, wenn es sich bei der Standardausgabe um ein Terminal handelt.
Eliah Kagan
5

Für cronJobs usw. möchten Sie die Bash-Erweiterungen vermeiden. Die entsprechenden POSIX- shUmleitungsoperatoren 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-Funktion in gewisser Weise einfacher und unkomplizierter ist. Die &>Syntax wurde entlehnt, cshwas Sie bereits davon überzeugen sollte, dass es eine schlechte Idee ist.

Tripleee
quelle
1

some_command | tee command.logund some_command > command.loghaben das Problem, dass sie die Befehlsausgabe nicht command.login Echtzeit in der Datei speichern.

Um dieses Problem zu vermeiden und die Befehlsausgabe in Echtzeit zu speichern, können Sie unbufferdas expectPaket anhängen .


Beispiel:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

Angenommen, log.pyenthält:

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

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

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

Franck Dernoncourt
quelle
Sie speichern die Ausgabe beim Empfang. Das Problem ist, dass Python die Pufferung einschaltet, wenn die Ausgabe kein TTY ist. Weitere Optionen zum Deaktivieren dieser Funktion in Python: stackoverflow.com/q/107705/2072269
muru