¿Cómo puedo guardar la salida de un comando en un archivo?
¿Hay alguna forma de hacerlo sin utilizar ningún software? Me gustaría saber cómo.
¿Cómo puedo guardar la salida de un comando en un archivo?
¿Hay alguna forma de hacerlo sin utilizar 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 desea stderr
también, use esto:
SomeCommand &> SomeFile.txt
o esto para agregar:
SomeCommand &>> SomeFile.txt
si desea que tanto stderr
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, elimine el 2
de arriba)
Ten en cuenta que someCommand 2> someFile.txt
y someCommand 2>> someFile.txt
también redirigen stderr
a someFile.txt
Estoy intentando 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.
@Nik-Lz A menudo esto se debe a que el comando está enviando toda su salida en stderr. Si gcc está generando mensajes de error, esto parece probable. Consulta el comentario de Slothworks sobre cómo capturar stderr en lugar de stdout.
Para escribir la salida de un comando en un archivo, existen básicamente 10 formas comúnmente utilizadas.
<em>Por favor, ten en cuenta que el <code>n.e.</code> en la columna de sintaxis significa "no existente".<br>Hay una forma, pero es demasiado complicada para encajar en la columna. Puedes encontrar un enlace útil en la sección de Lista al respecto.</em>
|| visible en terminal || visible en archivo || existente
Sintaxis || StdOut | StdErr || StdOut | StdErr || archivo
==========++==========+==========++==========+==========++===========
> || no | sí || sí | no || sobrescribir
>> || no | sí || sí | no || añadir
|| | || | ||
2> || sí | no || no | sí || sobrescribir
2>> || sí | no || no | sí || añadir
|| | || | ||
&> || no | no || sí | sí || sobrescribir
&>> || no | no || sí | sí || añadir
|| | || | ||
| tee || sí | sí || sí | no || sobrescribir
| tee -a || sí | sí || sí | no || añadir
|| | || | ||
n.e. (*) || sí | sí || no | sí || sobrescribir
n.e. (*) || sí | sí || no | sí || añadir
|| | || | ||
|& tee || sí | sí || sí | sí || sobrescribir
|& tee -a || sí | sí || sí | sí || añadir
comando > output.txt
El flujo de salida estándar se redirigirá únicamente al archivo, no será visible en el terminal. Si el archivo ya existe, será sobrescrito.
comando >> output.txt
El flujo de salida estándar se redirigirá únicamente al archivo, no será visible en el terminal. Si el archivo ya existe, los nuevos datos se añadirán al final del archivo.
comando 2> output.txt
El flujo de error estándar se redirigirá únicamente al archivo, no será visible en el terminal. Si el archivo ya existe, será sobrescrito.
comando 2>> output.txt
El flujo de error estándar se redirigirá únicamente al archivo, no será visible en el terminal. Si el archivo ya existe, los nuevos datos se añadirán al final del archivo.
comando &> output.txt
Ambos el flujo de salida estándar y el flujo de error estándar se redirigirán únicamente al archivo, nada será visible en el terminal. Si el archivo ya existe, será sobrescrito.
comando &>> output.txt
Ambos el flujo de salida estándar y el flujo de error estándar se redirigirán únicamente al archivo, nada será visible en el terminal. Si el archivo ya existe, los nuevos datos se añadirán al final del archivo.
comando | tee output.txt
El flujo de salida estándar se copiará al archivo, pero seguirá siendo visible en el terminal. Si el archivo ya existe, será sobrescrito.
comando | tee -a output.txt
El flujo de salida estándar se copiará al archivo, pero seguirá siendo visible en el terminal. Si el archivo ya existe, los nuevos datos se añadirán al final del archivo.
(*)
Bash no tiene una sintaxis abreviada que permita redirigir solo StdErr a un segundo comando, lo cual sería necesario aquí en combinación con tee
nuevamente para completar la tabla. Si realmente necesitas algo así, por favor mira "¿Cómo redireccionar stderr, y no stdout?" en Stack Overflow para ver algunas maneras de hacerlo, por ejemplo intercambiando flujos o utilizando sustitución de procesos.
comando |& tee output.txt
Ambos el flujo de salida estándar y el flujo de error estándar se copiarán al archivo, pero seguirán siendo visibles en el terminal. Si el archivo ya existe, será sobrescrito.
comando |& tee -a output.txt
Ambos el flujo de salida estándar y el flujo de error estándar se copiarán al archivo, pero seguirán siendo visibles en el terminal. Si el archivo ya existe, los nuevos datos se añadirán al final del archivo.
@karthick87 Esto no está realmente relacionado con la pregunta sobre redirigir la salida a un archivo, ya que simplemente redirige un flujo a otro. 2>&1
redirige STDERR a STDOUT, 1>&2
redirige STDOUT a STDERR y 3>&1
redirigiría el flujo 3 a STDERR.
También puedes usar tee
para enviar la salida a un archivo:
comando | tee ~/archivo_de_salida.txt
Una ligera modificación capturará también stderr:
comando 2>&1 | tee ~/archivo_de_salida.txt
o un poco más corto y menos complicado:
comando |& tee ~/archivo_de_salida.txt
tee
es útil si deseas poder capturar la salida del comando mientras la visualizas en tiempo real.
Dice que el carácter & 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 He eliminado esa edición. Lo siento por eso... no formaba parte de mi respuesta original.
@Aaron ¡Gracias! ¿tee agregará el archivo en tiempo real, verdad? Tengo un script de respaldo que utilizo para, jeje, respaldar mi PC, pero el registro no es en tiempo real. Mi PC se va a dormir después de que se completa la copia de seguridad, y el archivo de registro está vacío. ¿Debería usar otro comando para registrar los comandos?
Esta respuesta no guardará stderr. Utilice &>, consulte stackoverflow.com/questions/637827/… y tldp.org/LDP/abs/html/io-redirection.html
Una mejora a considerar -
Varios scripts inyectarán códigos de color en la salida que quizás no quieras que ensucien tu archivo de registro.
Para solucionar esto, puedes utilizar el programa sed para eliminar esos códigos. Ejemplo:
comando 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/archivo_de_salida.txt
¿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: Solo acabo de leer tu comentario, pero es posible que encuentres esta respuesta útil.
EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.