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

690

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

¿Hay alguna manera sin usar ningún software? Me gustaria saber como

led-Zepp
fuente

Respuestas:

737

Sí, es posible, solo redirige la salida a un archivo:

SomeCommand > SomeFile.txt  

O si desea agregar datos:

SomeCommand >> SomeFile.txt

Si también quieres stderrusar esto:

SomeCommand &> SomeFile.txt  

o esto para agregar:

SomeCommand &>> SomeFile.txt  

si desea que tanto la stderrsalida como la salida se muestren en la consola y en un archivo, use esto:

SomeCommand 2>&1 | tee SomeFile.txt

(Si solo desea la salida, suelte lo 2anterior)

Seth
fuente
15
Tenga en cuenta que someCommand 2> someFile.txty someCommand 2>> someFile.txttambién redirige stterra someFile.txt
Slothworks
Estoy tratando de hacer esto con el comando gcc pero no funciona. Funciona con otros comandos, pero no con este. Simplemente crea el archivo de salida sin nada dentro.
Nikos
@ Nik-Lz A menudo, esto se debe a que el comando envía toda su salida en stderr. Si gcc está generando mensajes de error, esto parece probable. Vea el comentario de Slothworks para saber cómo capturar stderr en lugar de stdout.
Jonathan Hartley
1
NB: para obtener la salida del makecomando en un archivo, se requiere esta sintaxis: make > someFile.txt 2>&1(fuente: linuxquestions.org/questions/linux-newbie-8/… )
Gabriel Staples
Tengo un problema que deja de escribir cuando el archivo alcanza unos 8 MB. ¿Es este un límite conocido?
relG
866

Para escribir la salida de un comando en un archivo, existen básicamente 10 formas de uso común.

Visión de conjunto:

Tenga en cuenta que 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 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

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

    La secuencia 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 será redirigido 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 será redirigido 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 la secuencia de error estándar se redirigirán al archivo solamente, no habrá nada 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 se redirigirán al archivo solamente, no habrá nada visible en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.

  • command | tee output.txt

    La secuencia de salida estándar se copiará en el archivo, aún estará visible en el terminal. Si el archivo ya existe, se sobrescribe.

  • command | tee -a output.txt

    La secuencia de salida estándar se copiará en el archivo, aún estará 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 se necesitaría aquí en combinación con teenuevamente para completar la tabla. Si realmente necesita algo así, consulte "¿Cómo canalizar stderr y no stdout?" en Stack Overflow para ver cómo se puede hacer, por ejemplo, intercambiando flujos o usando 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 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 las secuencias 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.

Byte Commander
fuente
66
Gracias por la mesa, es excelente! Esta debería ser la mejor respuesta
DevShark
3
@ karthick87 Esto no está realmente relacionado con la pregunta sobre la redirección de la salida a un archivo, ya que simplemente redirige una secuencia a otra. 2>&1redirige STDERR a STDOUT, 1>&2redirige STDOUT a STDERR y 3>&1redirigiría la secuencia 3 a STDERR.
Byte Commander
18
Solo una nota de que '| &' no funcionaba para mí en macOS. Esto se debe a que tiene una versión anterior de bash (creo). Los menos elegantes '2> y 1 |' funciona bien
Danny Parker
2
@ByteCommander me sale el error: sh: 1: Syntax error: "&" unexpectedcuando lo uso |& teedesde un script de Python en un servidor c9.io. Parece que se está utilizando un caparazón diferente. echo $SHELLmuestra /bin/bashy $SHELL --versionmuestra la versión 4.3.11 (1) -lanzamiento. Intenté #!/bin/bashen mi script de Python pero todavía consigo sh: 1: Syntax error. Obtuve lo que necesitaba, así que renuncio a ordenar las rarezas entre shy bashen mi servidor. Gracias.
samkhan13
1
@ samkhan13 parece que estás corriendo shy no bash(o tal vez bashen shmodo ...). Puede verificar qué está utilizando exactamente su proceso de shell actual ps -p $$ -o cmd=, porque echo $SHELLno es confiable y le mostrará su shell de inicio de sesión, ignorando si podría haber iniciado un subshell diferente.
Byte Commander
108

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

command | tee ~/outputfile.txt

Una ligera modificación también atrapará a stderr:

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

o un poco más corto y menos complicado:

command |& tee ~/outputfile.txt

teees útil si desea poder capturar la salida del comando mientras lo ve en vivo .

Aaron
fuente
Dice que & es inesperado, y no escribe el registro al mismo tiempo que se ejecuta el comando. Sin embargo, estoy usando esto en un archivo bash, ¿eso hace alguna diferencia?
tim687
@ tim687 He eliminado esa edición. Perdón por eso ... no fue parte de mi respuesta original.
Aaron
@ Aaron Gracias! tee agregará el archivo en tiempo real, ¿verdad? Tengo un script de copia de seguridad que utilizo para, jajaja, hacer una copia de seguridad de mi PC, pero el registro no es en tiempo real. Mi PC se pone en suspensión una vez que finaliza la copia de seguridad y el archivo de registro está vacío. ¿Debo usar otro comando para registrar los comandos?
tim687
¿Cómo interpreto el significado de 2>&1?
Mahesha999
@ Mahesha999 2 es el descriptor de archivo para STDERR y 1 es para STDOUT. De modo que 2> & 1 envía STDERR a STDOUT. Esta pregunta SO lo explica bastante bien: stackoverflow.com/questions/818255/…
Aaron
20

Puede redirigir la salida 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
caos
fuente
Muchas gracias ! ¿hay algún límite? como el tamaño máximo del archivo?
led-Zepp
3
El tamaño máximo del archivo está limitado a través del sistema de archivos
caos
Esta respuesta no guardará stderr. Use &>, consulte stackoverflow.com/questions/637827/… y tldp.org/LDP/abs/html/io-redirection.html
Panther
3
El OP nunca pidió salvar a stderr
caos
Dice "No existe tal archivo o directorio". ¿Es posible crear también los directorios automáticamente?
Qwerty
14

Una mejora a tener en cuenta:

Varios scripts inyectarán códigos de color en la salida que quizás no desee saturar 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
Sean Huber
fuente
1
¿Cómo guardar la salida de manera que se conserven los colores? Me gustaría importar el resultado de un comando en libreoffice y mantener los colores.
madrang
@madrang: Solo leo tu comentario ahora pero puedes encontrar esta respuesta útil.
Sylvain Pineau
Oh, casi exactamente lo que estoy buscando. ¿Cómo imprimir también en pantalla la salida?
Sigur
1
Tenga en cuenta que muchos comandos que producen una salida coloreada, como lsy grep, soportan --color=auto, que genera códigos de color solo si la salida estándar es un terminal.
Eliah Kagan
5

Para crontrabajos, etc., desea evitar las extensiones Bash. Los shoperadores de redireccionamiento POSIX equivalentes son

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

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

tripleee
fuente
1

some_command | tee command.logy some_command > command.logtienen el problema de que no guardan la salida del comando en el command.logarchivo en tiempo real.

Para evitar ese problema y guardar la salida del comando en tiempo real, puede agregar unbuffer, que viene con el expectpaquete.


Ejemplo:

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

Suponiendo que log.pycontiene:

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

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

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

Franck Dernoncourt
fuente
Guardan la salida a medida que la reciben, el problema es que Python activa el almacenamiento en búfer cuando la salida no está en un TTY. Otras opciones para deshabilitar esto en Python: stackoverflow.com/q/107705/2072269
muru