Como administrador de Linux, hay muchas ocasiones en las que debe guardar la salida de un comando en un archivo, además de simplemente imprimir la salida en la terminal. ¿No estás seguro de cómo? Deje que el comando tee de Unix haga el truco.
En este tutorial, aprenderá muchas formas de usar el tee
comando para guardar y agregar la salida a un archivo.
¿Listo? ¡Siga leyendo para llevar sus scripts de shell al siguiente nivel!
Requisitos
Este tutorial será una demostración práctica. Si desea seguir adelante, asegúrese de tener un sistema Linux. Este tutorial usa Ubuntu 20.04, pero puede usar cualquier versión de Linux.
Redireccionamiento de salidas de comandos (STDOUT/STDERR)
Antes de ejecutar el tee
comando, es crucial entender cómo funcionan las redirecciones. En Linux, todo se considera un archivo, incluidos los dispositivos, los directorios e incluso la salida de los comandos. Como resultado, puede tomar la salida de un comando y usar esa salida como entrada para otro comando (redirecciones de archivos).
Hay diferentes tipos de redireccionamientos, y cada uno tiene un propósito. Pero cuando se ejecuta el tee
comando, utiliza principalmente dos tipos diferentes de redireccionamientos:
- Redireccionamiento de salida estándar (STDOUT) (>):la salida predeterminada de un comando.
- Redireccionamiento de error estándar (STDERR)(2>):un mensaje de error generado por un comando y que se muestra en la pantalla.
Ambos redireccionamientos toman y guardan las salidas de los comandos en un archivo, pero verá cómo funcionan los redireccionamientos a continuación.
Ejecute el ls
comando sin argumentos para enumerar todos los contenidos (archivos y carpetas) de su directorio de trabajo.
ls
A continuación se muestra el STDOUT del comando ls.
A continuación, ejecute el siguiente comando para enumerar deliberadamente el contenido de un directorio (fake_directory
) que no existe.
ls fake_directory
Recibirá un mensaje de error que indica que el directorio no existe. Esta salida es el STDERR del comando ls.
Guardar los resultados de los comandos en un archivo
Suponga que desea guardar el STDOUT del ls
comando a un archivo en lugar de simplemente imprimir la salida en el terminal. En este caso, el operador de redirección (>
) es útil.
1. Ejecute el siguiente comando para guardar/redireccionar (>) el STDOUT del comando ls a un archivo llamado ls_stdout.txt. Dado que este comando guarda la salida en un archivo, no obtendrá una salida en su terminal.
ls > ls_stdout.txt
2. Ahora, ejecute el siguiente comando cat para ver el contenido de su archivo ls_stdout.txt.
cat ls_stdout.txt
3. De manera similar, ejecute el siguiente comando para guardar el STDERR (2>) del comando ls en un archivo llamado ls_stderr.txt. Nuevamente, no obtendrá una salida en su terminal ya que la salida se guarda en un archivo.
ls fake_directory 2> ls_stderr.txt
4. Ahora, ejecute el siguiente comando cat para ver el contenido del archivo ls_stderr.txt.
cat ls_stderr.txt
A continuación, puede confirmar que el STDERR del comando ls se guardó en ls_stderr.txt archivo.
5. Ejecute el siguiente comando para guardar (&>) STDOUT y STDERR del comando ls en un archivo llamado ls_alloutput.txt.
¿Por qué conformarse con uno cuando puedes tener ambos, verdad? Por lo general, es posible que desee almacenar ambas salidas en el mismo archivo para solucionar problemas o para fines de registro.
ls &> ls_alloutput.txt
6. Por último, ejecute el siguiente comando cat para ver el contenido del archivo ls_alloutput.txt
cat ls_alloutput.txt
Conectar programas con tuberías
Además de simplemente guardar las salidas en un archivo, puede lograr mucho más usando canalizaciones, como conectar programas. En escenarios del mundo real, lo más probable es que utilice canalizaciones junto con redireccionamientos de archivos y el tee
comando.
Una tubería (|
) es un mecanismo para la comunicación entre procesos que le permite conectar la salida de un comando a la entrada de otro comando. En otras palabras, la canalización toma el STDOUT de un proceso y conecta ese STDOUT al STDIN de otro proceso.
Ejecute el siguiente comando grep para buscar todas las líneas que contengan la palabra tcp en el archivo /etc/services.
grep tcp /etc/services
Ahora, ejecute el mismo grep
comando a continuación. Pero esta vez, canalice la salida del grep
anterior comando al less
comando para mostrar los resultados de la búsqueda una pantalla a la vez.
grep tcp /etc/services | less
¿Cómo funciona la tubería? Como puede ver a continuación, cuando usa el carácter de barra vertical (|), la salida del grep
El comando se almacena en una ubicación temporal. La salida luego se pasa como una entrada al less
comando.
Combinando la camiseta Unix (tee
) Comando, canalizaciones y redirecciones
Hasta ahora, has aprendido cómo el tee
el comando, las canalizaciones y las redirecciones funcionan. Pero, ¿por qué no usar los tres juntos para un mejor control de las salidas de los comandos?
Anteriormente usaste la canalización con redireccionamientos, y eso es un gran paso. Esta vez, usará tuberías y el tee
comando para enviar la salida de un comando a otro para su posterior procesamiento.
Ejecute el siguiente comando para enviar la salida del ls
comando a la pantalla y el result.txt
expediente. La salida de ls
se canaliza aún más al grep
comando para filtrar solo las líneas que contienen la palabra ip
.
ls | grep 'ip' | tee result.txt
Ahora, ejecuta el cat
comando para verificar el contenido del resultado archivo .txt.
cat result.txt
Adjuntar salida a archivos existentes
Anteriormente guardó la salida de los comandos en un archivo, pero ¿puede actualizar un archivo existente en lugar de crear uno nuevo? ¡Sí! Deja que el tee
ordena hacer la magia.
Por defecto, el tee
El comando sobrescribe el contenido de un archivo existente. Pero en muchos casos, es posible que desee agregar la salida de un comando a un archivo existente. Como registrar todos los eventos del servidor en tiempo real en un archivo de registro.
Con esta característica, el archivo de registro se agrega con nuevas entradas cada vez que ocurre un evento en el servidor.
Ejecute el siguiente comando para tomar la salida del comando ls -lR y agregue la salida (tee -a) al resultado.txt contenido del archivo. Este comando no proporciona salida ya que está enviando la salida del comando a un archivo.
ls -lR | tee -a result.txt
Ahora, ejecuta el cat
comando para verificar el contenido del result.txt
archivo.
cat result.txt
Como puede ver a continuación, la salida del ls -lR
el comando se agrega al final del result.txt archivo.
Uso del tee
Comando en conjunto con sudo
Muchos comandos requieren privilegios elevados o sudo
acceso, como realizar modificaciones dentro del /etc directorio. La pregunta es, ¿el tee
el comando trabaja de la mano con sudo
? ¡Sí!
Anteponer sudo al comando tee permite que un usuario que no sea root escriba datos en un archivo que solo un usuario root puede modificar. Por ejemplo, desea habilitar el usuario ata para escribir datos en /etc/ata.conf expediente. Pero, al mismo tiempo, no quiere darle al usuario ata privilegios de root.
1. Inicie sesión en su máquina con un usuario que no sea root.
2. A continuación, ejecute el siguiente comando sin sudo para escribir los datos de texto en el archivo /etc/ata.conf.
echo "data" > tee /etc/ata.conf
Como puede ver a continuación, obtendrá un error de Permiso denegado desde ata el usuario no tiene acceso de escritura a /etc/ata.conf archivo.
3. Ejecute el mismo comando a continuación como lo hizo en el paso dos para escribir los datos de texto en el archivo /etc/ata.conf. Pero esta vez, anteponga el comando sudo al comando tee. Hacerlo le permite al usuario ata para completar el comando (elevado) como usuario no root.
echo "data" | sudo tee /etc/ata.conf
Por último, ejecute el siguiente comando cat para verificar que ata el usuario podría escribir el texto "datos" en /etc/ata.conf.
cat /etc/ata.conf
Conclusión
A lo largo de este tutorial, aprendió cómo usar el comando tee de Unix para escribir datos en archivos y cómo funciona junto con otros comandos. En este punto, debe tener una poderosa combinación de comandos que puede usar para administrar la entrada y salida en el entorno de línea de comandos de Linux.
Eres como un chef de sushi, controlas completamente los ingredientes y las proporciones de cada plato. Puede personalizar cada pedido sobre la marcha para adaptarlo a los gustos de su cliente. El único límite es tu imaginación (y quizás el tamaño de la ventana de tu terminal).
Ahora, ¡adelante y crea increíbles brebajes de línea de comandos!