Guardar la salida de un comando en un archivo con logsave
En el tutorial sobre el terminal, en particular en el capítulo sobre redirigir entrada y salida en Linux, viste como se podía guardar el resultado de la ejecución de un comando en un archivo. Esto es algo realmente cómodo, y práctico, sobre todo cara a auditorías, o simplemente para saber que vas haciendo por los servidores del mundo. Sin embargo, es necesario conocer la notación, y si no te has acostumbrado todavía, es posible, que no te resulte nada cómodo gestionar <
, <<
, >
y >>
. Pero por suerte el ecosistema de herramientas que tienes al alcance de tus dedos en Linux es, simplemente, espectacular, y ante cualquier problema, siempre hay mas de una solución, como es este caso. En este caso tienes logsave
para guardar la salida de un comando en un archivo.
Así, en este artículo, encontrarás información sobre logsave
. Como puedes sacarle provecho, y que usos le puedes dar. Ya sea, porque no quiere lidiar con, las entradas y salidas en Linux, o por la razón que sea.
Guardar la salida de un comando en un archivo con logsave
¿Que es logsave y como se utiliza?
logsave
ejecuta un comando que guarda en un archivo la salida de la ejecución de un comando. Así por ejemplo, si ejecutamos la siguiente instrucción guardaremos el listado del contenido del directorio en el que nos encontremos en el archivo contenido.txt
,
logsave contenido.txt ls -la
Indicarte que el resultado de la ejecución del comando ls -la
, también se mostrará por pantalla. Si quieres evitar esto, no tienes mas remedio que redirigir la salida estándar, ejecutando la instrucción anterior de la siguiente manera,
logsave contenido.txt ls -la > /dev/null
O mejor todavía, para evitar que los errores se puedan mostrar por pantalla, sería ejecutar la instrucción anterior de la siguiente manera,
logsave contenido.txt ls -la /dev/null 2>&1
Veo, que al final no he conseguido evitar redirigir entrada y salida.
Si esto lo quisieras hacer enteramente utilizando la redirección de entrada y salida como te indico en es capítulo del tutorial del terminal, simplemente tienes que ejecutar la siguiente instrucción,
ls -la > contenido.txt
Si también quieres redirigir los errores al mismo archivo, en ese caso, la instrucción a ejecutar sería,
ls -la > contenido.txt 2>&1
O si quieres, como en el caso anterior, que los errores vayan al archivo contenido.txt
, la instrucción pasaría a ser,
ls -la > contenido.txt 2>/dev/null
Añadir contenido
Al ejecutar logsave
habrás observado que cada ejecución reemplaza el contenido del archivo. Si no te has fijado hasta el momento, lo puedes hacer de forma muy sencilla probando con la instrucción logsave contenido.txt date
. Esto te devolverá un resultado como lo que te muestro a continuación,
Log of date
Wed Oct 21 06:24:07 2020
mié 21 oct 2020 06:24:07 CEST
Wed Oct 21 06:24:07 2020
----------------
Si lo que quieres hacer es añadir contenido, en lugar de reemplazar, tienes que utilizar la opción -a
. Por ejemplo, para el caso que nos ocupa, si ejecutas en dos ocasiones logsave -a contenido.txt date
, el resultado será algo como le que te muestro a continuación,
Log of date
Wed Oct 21 06:43:50 2020
mié 21 oct 2020 06:43:50 CEST
Wed Oct 21 06:43:50 2020
----------------
Log of date
Wed Oct 21 06:43:51 2020
mié 21 oct 2020 06:43:51 CEST
Wed Oct 21 06:43:51 2020
----------------
Sobre el encabezado y el pie
Una cuestión interesante de logsave
es que en cada ejecución, te mostrará cuando empieza la ejecución del comando y cuando termina. Evidentemente, en los ejemplos que has hecho hasta el momento, utilizando date
, el inicio y el fin, coincide. Sin embargo, esto no siempre es así. Si ejecutas la siguiente instrucción,
logsave contenido.txt du /
Verás claramente que son diferentes y que no coinciden, con lo que es algo que tienes que tener en cuenta.
Sin embargo, no siempre vas a querer contar con ese encabezado y pie. En estos casos, casi, que es mejor utilizar las redirecciones, como te mostraré mas adelante. Pero, si, de todas formas, lo quieres hacer con logsave
, puedes hacerlo de la siguiente forma,
sed -i "1,3d" contenido.txt
sed -i "$(($(wc -l < contenido.txt)-2)),\$d" contenido.txt
Con sed
puedes borrar un rango concreto de filas, tal y como puedes ver fácilmente en la primera de las instrucciones anteriores. Para el caso de borrar las últimas, resulta ligeramente mas complejo, porque es necesario determinar cual es la última línea y contar hacia atrás… Pero como ves, tampoco es nada del otro mundo.
Claro, que utilizando la opción de redirigir entrada y salida en lugar de logsave
, esto es algo realmente sencillo, porque no tienes que recurrir a estas artimañas para quitar el encabezado y el pie. En ese caso sería tan sencillo, como ejecutar,
date > contenido.txt
Para el caso de reemplazar el contenido, o para ir añadiendo en cada ejecución, entonces utilizarías date >> contenido.txt
Registros y logs
Sin lugar a dudas, logsave
es una opción interesante para utilizar como registro o log, aunque yo prefiero utilizar Syslog, que al fin y al cabo lo tienes a tu disposición para estas y otras cosas. En ese caso, para escribir el log, tan solo tendrías que ejecutar la siguiente instrucción,
logger $(date)
Puedes consultar el resultado de la ejecución de esta instrucción en /var/log/syslog
Más información,
Imagen de portada Denny Müller en Unsplash
La entrada Guardar la salida de un comando en un archivo con logsave aparece primero en El atareao.