¿Cómo guardo la salida del terminal en un archivo?

392

¿Cómo guardo el resultado de un comando en un archivo?

¿Hay alguna forma de no usar ningún software? Me gustaría saber cómo.

    
pregunta led-Zepp 14.02.2014 - 20:49

7 respuestas

387

Sí, es posible, simplemente redirija la salida a un archivo:

someCommand > someFile.txt  

O si desea agregar datos:

someCommand >> someFile.txt

Si quieres stderr también usa esto:

someCommand &> someFile.txt  

o esto para anexar:

someCommand &>> someFile.txt  
    
respondido por el Seth 14.02.2014 - 20:52
529

Para escribir el resultado de un comando en un archivo, básicamente hay 10 formas comúnmente usadas.

Descripción general:

  

Tenga en cuenta que n.e. en la columna de sintaxis significa "no existente".
  Hay una manera, pero es demasiado complicado para caber en la columna. Puede encontrar un enlace útil en la sección de la Lista al respecto.

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

    El flujo de salida estándar se redireccionará al archivo solamente, no será visible en el terminal. Si el archivo ya existe, se sobrescribe.

  • command >> output.txt

    El flujo de salida estándar se redireccionará al archivo solamente, no será visible en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.

  • command 2> output.txt

    El flujo de error estándar se redireccionará al archivo solamente, no será visible en el terminal. Si el archivo ya existe, se sobrescribe.

  • command 2>> output.txt

    El flujo de error estándar se redireccionará al archivo solamente, no será visible en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.

  • command &> output.txt

    Tanto la salida estándar como la secuencia de error estándar serán redirigidas solo al archivo, nada será visible en el terminal. Si el archivo ya existe, se sobrescribe.

  • command &>> output.txt

    Tanto la salida estándar como la secuencia de error estándar serán redirigidas solo al archivo, nada será visible en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.

  • command | tee output.txt

    El flujo de salida estándar se copiará en el archivo, aún será visible en el terminal. Si el archivo ya existe, se sobrescribe.

  • command | tee -a output.txt

    El flujo de salida estándar se copiará en el archivo, aún será visible en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.

  • (*)

    Bash no tiene una sintaxis abreviada que permita conectar solo StdErr a un segundo comando, que sería necesario aquí en combinación con tee nuevamente para completar la tabla. Si realmente necesita algo como eso, mire "Cómo conectar stderr y no stdout?" en Desbordamiento de pila , de alguna manera, cómo se puede hacer esto, p. mediante el intercambio de secuencias o mediante la sustitución de procesos.

  • command |& tee output.txt

    Tanto la salida estándar como las secuencias de error estándar se copiarán en el archivo mientras aún estén visibles en el terminal. Si el archivo ya existe, se sobrescribe.

  • command |& tee -a output.txt

    Tanto la salida estándar como las secuencias de error estándar se copiarán en el archivo mientras aún estén visibles en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.

respondido por el Byte Commander 08.02.2016 - 15:52
80

También puede usar tee para enviar la salida a un archivo:

command | tee ~/outputfile.txt

Una pequeña modificación también detectará stderr:

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

o un poco más corto y menos complicado:

command |& tee ~/outputfile.txt

tee es útil si desea poder capturar el resultado del comando mientras lo visualiza en vivo .

    
respondido por el Aaron 20.06.2014 - 06:45
17

Puede redirigir el resultado del comando a un archivo:

your_command >/path/to/file

Para agregar el resultado del comando a un archivo en lugar de sobrescribirlo, use:

your_command >>/path/to/file
    
respondido por el chaos 14.02.2014 - 20:52
11

Una mejora a considerar -

Varias secuencias de comandos inyectarán códigos de color en la salida, por lo que es posible que no desee saturar su archivo de registro.

Para solucionar esto, puede usar el programa sed para eliminarlo esos códigos. Ejemplo:

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

Para cron jobs, etc., desea evitar las extensiones de Bash. Los operadores de redirección POSIX sh equivalentes son

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

Notará que la instalación de POSIX es en cierto sentido más simple y más directa. La sintaxis de &> se tomó prestada de csh , que ya debería convencerlo de que es una mala idea.

    
respondido por el tripleee 11.04.2018 - 14:25
0

some_command | tee command.log y some_command > command.log tienen el problema de que no guardan el resultado del comando en el archivo command.log en tiempo real.

Para evitar ese problema y guardar el resultado del comando en tiempo real, puede agregar unbuffer , que viene con el paquete expect .

Ejemplo:

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

Suponiendo que log.py contiene:

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

puedes ejecutar unbuffer python log.py | tee command.log o unbuffer python log.py > command.log

Más información: ¿Cómo puedo guardar un resultado de comando en un archivo en tiempo real?

    
respondido por el Franck Dernoncourt 04.07.2018 - 22:54

Lea otras preguntas en las etiquetas