¿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.
¿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.
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
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
|& tee ~/outputfile.txt
después de cada commnd
.script
el comando tiene el beneficio (o la desventaja) adicional de recargar ~/.bashrc
cuando empiece.script
comando muestra el símbolo del sistema ($PS1
) seguido de los comandos que ha introducido.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