Redirección en Linux
Al ejecutar algún comando en el shell de Ubuntu (linux en general), el resultado, por defecto, se muestra en la consola (salida estándar).
Si se necesita, por ejemplo, guardar el resultado de un comando (como ser la ejecución de grep) en un archivo, es necesario redirigir la salida estándar al archivo, en lugar de a la pantalla.
Tenemos tres flujos para redireccionar (Salida estandar, Error estandar, Entrada estandar), y varios operadores para la tarea.
A continuación una descripción de los operadores que vamos a usar en los ejemplos.
Flujo de Datos | Valor |
---|---|
Entrada Estandar | 0 |
Salida Estandar | 1 |
Error Estandar | 2 |
Nota: "cmd" representa un comando, como ser grep, find, etc.
Operador | Descripción |
---|---|
cmd >nombre_archivo | Redirecciona la salida estándar al archivo o dispositivo. Si el archivo no existe lo crea. Si el archivo existe, sobreescribe el contenido (se poerden los datos actuales del archivo) |
cmd >>nombre_archivo | Redirecciona la salida estándar al archivo o dispositivo. Si el archivo no existe lo crea. Si el archivo existe, agrega la salida al final de los datos existentes |
cmd2>nombre_archivo | Redirecciona el error estándar al archivo o dispositivo. Si el archivo no existe lo crea. Si el archivo existe, sobreescribe el contenido (se pierden los datos actuales del archivo) |
cmd 2>>nombre_archivo | Redirecciona el error estándar al archivo o dispositivo. Si el archivo no existe lo crea. Si el archivo existe, agrega los datos del error al final de los datos existentes |
cmd 2>&1 | Redirecciona el error estándar a la salida estándar. |
cmd >&nombre_archivo | Redirecciona el error y salida estándar al archivo o dispositivo. Si el archivo no existe lo crea. Si el archivo existe, sobreescribe el contenido (se pierden los datos actuales del archivo) |
cmd <nombre_archivo | Redirecciona la entrada estándar desde el archivo o el dispositivo al comando (por defecto, la entrada estándar es el teclado) |
Ejemplos
Nota: En el directorio actual tengo 2 archivos ("lecturaParaTodos.txt" y "lecturaSoloRoot.txt"), uno de ellos solo root puede leerlo (para forzar un error).
"R:" Es la respuesta del sistema mostrado en la pantalla.
Se busca la palabra "linux" en el directorio actual:
grep -i linux *
R:
lecturaParaTodos.txt: Linux es genial. // resultado salida estandar
grep: lecturaSoloRoot.txt: Permiso denegado // resultado error estandar
1) Redirigir la entrada estandar a un archivo
grep -i linux * > salida.txt
R:
grep: lecturaSoloRoot.txt: Permiso denegado
En la consola solo se muestra el error, los resultados de grep se guardaron en el archivo "salida.txt".
2) Redirigir el error estandar a un archivo
grep -i linux * 2> error.txt
R:
lecturaParaTodos.txt:Linux es genial.
En consola se muestra los resultados de grep, pero no se muestra el error, el cual se guardo en el archivo "error.txt".
3) Redirigir la salida estandar a un archivo y el error estandar a otro archivo.
grep -i linux * 2> error.txt 1> salida.txt
No muestra resultados en pantalla, podemos ver los resultados con: "cat error.txt" y "cat salida.txt"
4) Redirigir la salida y entrada a un mismo archivo.
4.1) grep -i linux * > salida_error.txt 2>&1
4.2) grep -i linux * >& salida_error.txt
Igual que en el ejemplo anterior, no muestra resultados en pantalla, podemos ver los resultados con: "cat salida_error.txt".
Redirigir a un archivo y mostrar en pantalla. El comando tee.
En los ejemplos anteriores, los resultados redirigidos a los archivos no se ven en la pantalla.
Si es necesario redirigir la salida a un archivo, y también ver el resultado en la pantalla, se usa el comando "tee".
El comando tee lee desde la entrada estandar, y escribe en la salida estandar y en los archivos indicados.
tee nombre_archivo o tee -a nombre_archivo
Por defecto, tee sobreescribe los datos de "nombre_archivo".
Con "-a" agrega los datos al final del archivo "nombre_archivo".
Ejemplos
1) Redirigir la salida y error estandar a un mismo archivo, y ver el resultado en pantalla.
grep -i linux * 2>&1 | tee -a ../salida_error.txt
R:
lecturaParaTodos.txt:Linux es genial.
grep: lecturaSoloRoot.txt: Permiso denegado
Si vemos el archivo generado: cat ../salida_error.txt se ve la misma información que en pantalla
2) Redirigir la salida y error estandar a diferentes archivos, y ver el resultado en pantalla
(grep -i linux * | tee ../salida.txt) 3>&1 1>&2 2>&3 | tee ../error.txt
R:
lecturaParaTodos.txt:Linux es genial.
grep: lecturaSoloRoot.txt: Permiso denegado
Ver los resultados independientes en los archivos: "cat ../error.txt ../salida.txt"
La explicación de este último ejemplo es interesante, y puede verse en el libro: "Linux Server Hacks" de Rob Flickenger - O'Reilly ( ver: "n>m : Swap STDOUT and STDERR" ).
No hay comentarios:
Publicar un comentario