it-swarm.com.de

Wie speichere ich Terminalausgaben 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.

662
led-Zepp

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 Sie stderr möchten, verwenden Sie auch Folgendes:

SomeCommand &> SomeFile.txt  

oder dies anhängen:

SomeCommand &>> SomeFile.txt  

wenn Sie sowohl stderr als auch Ausgabe auf der Konsole und in einer Datei benutze das:

SomeCommand 2>&1 | tee SomeFile.txt

(Wenn Sie nur die Ausgabe möchten, legen Sie den 2 oben ab.)

704
Seth

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

Überblick:

Bitte beachten Sie, dass der n.e. in der Syntaxspalte "nicht vorhanden" bedeutet.
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 tee erneut benötigt würde, um die Tabelle zu vervollständigen. Wenn Sie so etwas wirklich brauchen, schauen Sie bitte unter "Wie leitet man stderr und nicht stdout?" Auf Stack Overflow nach, wie dies z. 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.

833
Byte Commander

Sie können die Ausgabe auch mit tee an eine Datei 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

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

105
Aaron

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
20
chaos

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
14
Sean Huber

Für cron Jobs usw. möchten Sie die Bash-Erweiterungen vermeiden. Die entsprechenden Umleitungsoperatoren für POSIX sh lauten

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 von csh ausgeliehen, was Sie bereits davon überzeugen sollte, dass es eine schlechte Idee ist.

5
tripleee

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

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


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

sie können unbuffer python log.py | tee command.log oder unbuffer python log.py > command.log ausführen.

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

1