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

¿Cómo guardo la salida de un comando en un archivo?

¿Hay una manera sin usar ningún software? Me gustaría saber cómo.

Sí, es posible, simplemente redirija la salida (también conocida como stdout) a un archivo:

SomeCommand > SomeFile.txt  

O si desea agregar datos:

SomeCommand >> SomeFile.txt

Si quieres stderr también use esto:

SomeCommand &> SomeFile.txt  

o esto para anexar:

SomeCommand &>> SomeFile.txt  

si quieres tener ambos stderr y salida se muestra en la consola y en un archivo usa esto:

SomeCommand 2>&1 | tee SomeFile.txt

(Si solo desea la salida, suelte el 2 arriba)

Para escribir la salida de un comando a un archivo, básicamente hay 10 utilizados.

Visión general:

Tenga en cuenta que el n.e. en la columna de sintaxis significa "no existente".
Hay una manera, pero es demasiado complicado para encajar 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 redirigirá solo al archivo, no será visible en el terminal. Si el archivo ya existe, se sobrescribe.

  • command >> output.txt

    El flujo de salida estándar se redirigirá solo al archivo, 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 redirigirá solo al archivo, no será visible en el terminal. Si el archivo ya existe, se sobrescribe.

  • command 2>> output.txt

    El flujo de error estándar se redirigirá solo al archivo, 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 el flujo de error estándar se redirigirán solo al archivo, no se verá nada en el terminal. Si el archivo ya existe, se sobrescribe.

  • command &>> output.txt

    Tanto la salida estándar como el flujo de error estándar se redirigirán solo al archivo, no se verá nada 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, seguirá siendo 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, seguirá siendo 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 canalizar solo StdErr a un segundo comando, que sería necesario aquí en combinación con tee de nuevo para completar la tabla. Si realmente necesitas algo así, por favor mira "¿Cómo canalizar stderr y no stdout?"en Desbordamiento de pila para algunas formas de cómo se puede hacer esto, por ejemplo, intercambiando flujos o usando sustitución de procesos.

  • command |& tee output.txt

    Tanto la salida estándar como los flujos de error estándar se copiarán en el archivo sin dejar de ser visibles en el terminal. Si el archivo ya existe, se sobrescribe.

  • command |& tee -a output.txt

    Tanto la salida estándar como los flujos de error estándar se copiarán en el archivo sin dejar de ser visibles en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.

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

command | tee ~/outputfile.txt

Una ligera 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 quieres ser capaz de capture la salida de comandos mientras la ve en vivo.

Puede redirigir la salida del comando a un archivo:

your_command >/path/to/file

Para agregar la salida del comando a un archivo en lugar de sobrescribirlo, use:

your_command >>/path/to/file

Una mejora a tener en cuenta -

Varios scripts inyectarán códigos de colores en la salida que es posible que no desee que abarroten su archivo de registro.

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

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

Aquí hay dos preguntas diferentes. El primero está en el título:

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

La segunda pregunta está en el cuerpo:

¿Cómo guardo la salida de un comando en un archivo?

Todas las respuestas publicadas aquí abordan la segunda pregunta, pero ninguna aborda la primera pregunta, que tiene una gran respuesta en Unix y Linux:

Esta respuesta usa un comando poco conocido llamado script que guarda toda la salida de su shell en un archivo de texto hasta que escriba exit. La salida del comando sigue apareciendo en la pantalla, pero también aparece en el archivo de texto.

El proceso es sencillo. Utilizar:

$ script ~/outputfile.txtScript started, file is /home/rick/outputfile.txt$ command1$ command2$ command3$ exitexitScript done, file is /home/rick/outputfile.txt

Luego mire su salida grabada de los comandos 1, 2 y 3 con:

cat ~/outputfile.txt

Esto es similar a respuesta anterior de:

command |& tee ~/outputfile.txt
  • Pero no tienes que usar |& tee ~/outputfile.txt después de cada commnd.
  • El script el comando tiene el beneficio (o la desventaja) adicional de recargar ~/.bashrc cuando empiece.
  • El script comando muestra el símbolo del sistema ($PS1) seguido de los comandos que ha introducido.
  • El script el comando registra todos los detalles a todo color.

Para cron trabajos, etc. desea evitar las extensiones Bash. El POSIX equivalente sh los operadores de redirección son

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

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

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

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


Ejemplo:

sudo apt-get install expectunbuffer some_command | tee command.logunbuffer some_command > command.log

Asumir log.py contener:

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

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

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

Si desea enviar la salida al archivo mientras se ejecuta el comando:

script -c ./path/to/executable.bash -f log.txt