Come posso salvare l'output del terminale in un file?

455

Come posso salvare l'output di un comando in un file?

C'è un modo senza utilizzare alcun software? Mi piacerebbe sapere come.

    
posta led-Zepp 14.02.2014 - 20:49

7 risposte

456

Sì, è possibile, basta reindirizzare l'output su un file:

SomeCommand > SomeFile.txt  

O se vuoi aggiungere dati:

SomeCommand >> SomeFile.txt

Se vuoi che stderr utilizzi anche questo:

SomeCommand &> SomeFile.txt  

o questo per aggiungere:

SomeCommand &>> SomeFile.txt  

se vuoi avere sia stderr che emettere visualizzato sul console e in un file usa questo:

SomeCommand 2>&1 | tee SomeFile.txt

(Se vuoi solo l'output, rilascia il 2 sopra)

    
risposta data Seth 14.02.2014 - 20:52
608

Per scrivere l'output di un comando in un file, ci sono fondamentalmente 10 modi comunemente usati.

Panoramica:

% Bl0ck_qu0te%
          || 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

Lista:

  • command > output.txt

    Il flusso di output standard verrà reindirizzato al solo file, non sarà visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command >> output.txt

    Il flusso di output standard verrà reindirizzato al solo file, non sarà visibile nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.

  • command 2> output.txt

    Il flusso di errore standard verrà reindirizzato al solo file, non sarà visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command 2>> output.txt

    Il flusso di errore standard verrà reindirizzato al solo file, non sarà visibile nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.

  • command &> output.txt

    Sia lo standard output che lo standard error stream verranno reindirizzati solo al file, nulla sarà visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command &>> output.txt

    Sia lo standard output che lo standard error stream verranno reindirizzati solo al file, nulla sarà visibile nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file ..

  • command | tee output.txt

    Il flusso di output standard verrà copiato nel file, sarà comunque visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command | tee -a output.txt

    Il flusso di output standard verrà copiato nel file, sarà comunque visibile nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.

  • (*)

    Bash non ha una sintassi abbreviata che consente di eseguire il piping solo di StdErr su un secondo comando, che sarebbe necessario qui in combinazione con tee di nuovo per completare la tabella. Se hai davvero bisogno di qualcosa del genere, guarda "Come pipe stderr, e non stdout?" on Overflow dello stack per alcuni aspetti su come ciò può essere fatto, ad es. scambiando flussi o utilizzando la sostituzione del processo.

  • command |& tee output.txt

    Sia l'output standard che i flussi di errore standard saranno copiati nel file mentre sono ancora visibili nel terminale. Se il file esiste già, viene sovrascritto.

  • command |& tee -a output.txt

    Sia l'output standard che i flussi di errore standard saranno copiati nel file mentre sono ancora visibili nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.

risposta data Byte Commander 08.02.2016 - 15:52
90

Puoi anche utilizzare tee per inviare l'output a un file:

command | tee ~/outputfile.txt

Una leggera modifica attirerà anche lo stderr:

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

o leggermente più corto e meno complicato:

command |& tee ~/outputfile.txt

tee è utile se vuoi essere in grado di acquisire l'output del comando mentre lo guardi anche dal vivo .

    
risposta data Aaron 20.06.2014 - 06:45
17

È possibile reindirizzare l'output del comando in un file:

your_command >/path/to/file

Per aggiungere l'output del comando a un file invece di sovrascriverlo, usa:

your_command >>/path/to/file
    
risposta data chaos 14.02.2014 - 20:52
12

Un miglioramento da considerare -

Vari script inseriranno nell'output codici colore che potresti non volere ingombrare nel tuo file di registro.

Per risolvere il problema, puoi utilizzare il programma sed per eliminare quei codici. Esempio:

command 2>&1 | sed -r 's/'$(echo -e "3")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
    
risposta data Sean Huber 08.07.2014 - 22:57
3

Per cron di posti di lavoro ecc. vuoi evitare le estensioni di Bash. Gli operatori equivalenti di reindirizzamento% CO_DE% POSIX sono

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

Noterai che la struttura POSIX è in un certo senso più semplice e diretta. La sintassi sh è stata presa in prestito da &> che dovrebbe già convincerti che è una cattiva idea.

    
risposta data tripleee 11.04.2018 - 14:25
0

some_command | tee command.log e some_command > command.log hanno il problema che non salvano l'output del comando sul file command.log in tempo reale.

Per evitare questo problema e salvare l'output del comando in tempo reale, puoi aggiungere unbuffer , che viene fornito con il pacchetto expect .

Esempio:

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

Supponendo che log.py contenga:

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

puoi eseguire unbuffer python log.py | tee command.log o unbuffer python log.py > command.log

Ulteriori informazioni: Come posso salvare un output di comando su un file in tempo reale?

    
risposta data Franck Dernoncourt 04.07.2018 - 22:54

Leggi altre domande sui tag