Wie speichere ich die Ausgabe eines Befehls in einer Datei?
Gibt es einen Weg ohne Software? Ich würde gerne wissen, wie.
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.
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
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
|& tee ~/outputfile.txt
nach jedem commnd
.script
befehl hat zusätzlichen Nutzen (oder Nachteil) des Nachladens ~/.bashrc
wenn es anfängt.script
befehl zeigt die Eingabeaufforderung ($PS1
) gefolgt von den eingegebenen Befehlen.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