¿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.txtSi 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 || appendcommand > 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.txtUna ligera modificación también detectará stderr:
command 2>&1 | tee ~/outputfile.txto un poco más corto y menos complicado:
command |& tee ~/outputfile.txttee 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/filePara 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.txtLuego mire su salida grabada de los comandos 1, 2 y 3 con:
cat ~/outputfile.txtEsto 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 | barNotará 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.logAsumir log.py contener:
import timeprint('testing')time.sleep(100) # sleeping for 100 secondspuedes 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