Páginas

domingo, 1 de febrero de 2009

Las tuberías (Pipes)

Si queremos procesar la salida estándar de un comando como la entrada estándar de otro comando, podemos guardar la salida estándar vía el comando de redirección a un archivo temporario:

$ Who > archivo.temp

Ejecutamos el comando who para ver quien esta ingresado en el sistema. La salida del comando who es un usuario por línea, que nos rinde información muy útil, la cual almacenamos en archivo.temp.

Luego corremos éste comando:

$ wc -l

Esta sentencia cuenta el número de líneas en archivo.temp. El resultado final es lo que deseamos saber, cuantos usuarios se encuentran ingresados (logged in) en el sistema.

GNU/Linux provee un método muy útil de acortar éste proceso. Con el uso del caracter de tubería (|),podemos combinar los comandos que ejecutamos previamente y combinarlos en uno sólo:

$ who | wc -l

El carácter de tubería le indica al shell que conecte la salida estándar (stdout) del comando a la izquierda (who), a la entrada estándar (stdin) del comando en la derecha (wc -l). Ahora la salida del comando who es automáticamente pasada al comando wc -l, sin la necesidad de tener que crear archivo.temp, que tuvimos que hacer anteriormente.

El resultado de éste comando, asistido por una tubería, es producir el número de personas que se encuentran ingresados en el sistema. También como resultado de filtrar con la tubería, vemos, que perdimos parte de la información del comando who, pero, ésto no tiene importancia, ya que sólo estamos interesados en el resultado final, que es el número de personas.

Al igual que en el caso de la redirección de I/O, ambos comandos involucrados en una tubería se ejecutan sin conocimiento de que están conectando sus flujos de salida a otro comando. El shell establece la conexión de tubería antes de ejecutar los comandos.

Ambos comandos son conectados por la tubería simultáneamente. Si el lector hace intentos de lectura en el momento en el que la tubería está vacía, el lector esperará en la tubería antes de continuar. Si se llena la tubería (en el caso de que exista un límite al tamaño de la tubería), el escritor espera hasta que alguna data haya sido removida desde la otra punta de la tubería.

Las tuberías sólo operan en los flujos de salida estándar de los comandos. Todo mensaje escrito al error estándar del comando será escrito a la pantalla del terminal, a menos que, éste sea redireccionado también por separado.

Las tuberías pueden ser usadas para conectar dos o más comandos, hacemos la mención en éste punto, ya que sólo hemos efectuado ejemplos con dos, por cuestión de brevedad. Conexiones de múltiples tuberías es cosa muy común en GNU/Linux, todo ésto es gracias a una clase general de utilitarios, mejor conocidos como filtros. Un filtro es un programa que lee los flujos de su entrada estándar (stdin), y escribe sus resultados a la salida estándar (stdout), y así llevando a cabo un filtrado a través de un sistema de tuberías.

En éste ejemplo mostramos una doble tubería:

$ who | grep tty | wc -l.

La salida del comando who es procesada por el comando grep, comando que filtra (elimina todas las líneas que no incluyen la cadena de caracteres pasada como argumento a grep) las líneas que no contienen la cadena “tty”. La salida es finalmente pasada por la tubería al comando wc, que procede a contar el número de líneas, que corresponde directamente al número de usuarios conectados en toda la red.

$ grep configure /etc/* 2>/dev/null.

Esta sentencia grep es usada para efectuar una búsqueda de todas las líneas de los archivos debajo del árbol /etc que contienen la cadena configure. Como ejecutamos el comando como un usuario sin privilegios, que no podrá abrir algunos archivos, nos devolverá muchos mensajes de error que dicen así: “permission denied”. Si redireccionamos el flujo de error al dispositivo nulo, sólo veremos en la pantalla las salidas validas.

dmesg | grep -i cpu (-i no distingue entre may y min. Mostrará la información del dmesg de palabras que contengan cpu).

cut -d: -f2 (cut divide la entrada de datos y la separa en base a caract definidas d (delimiter) seguido del carácter delimitador (:)

f (field) para extraer el campo deseado del comando cut

esperará que introduzcamos los datos. Si introducimos

dato:dato1:dato2:dato3

dato1 (que es el segundo dato)

echo “dato0:dato1:dato2:dato3” | cut -d: -f3

dato2

Si miramos el archivo /etc/passwd el separador de campos es :

¿Que comando desplegaria solo el nombre de los usuarios?

cat /etc/passwd | cut -d: f1.

¿Que haria el siguiente comando?

cat /etc/hosts | cut -do -f1.

cat /etc/hosts | cut -dc -f1.

La capacidad de poder conectar comandos de esta manera, para formar utilitarios grandes y poderosos, es uno de los aspectos de GNU/Linux que lo convierten en una herramienta verdaderamente productiva. Los utilitarios estándares muy a menudo sólo son pequeñas piezas con las cuales se construyen grandes herramientas a través del uso de tuberías y redireccionamiento. Sólo con mucha práctica es que esta destreza puede ser desarrollada.

Podemos construir poderosos comandos con el uso de tuberías, simplemente colocando una serie de filtros. Otros sistemas operativos sólo pueden lograr éste nivel de funcionamiento escribiendo funciones en programas.

Fuente: Antonio Perpiñan FCLD Fundamentos de Sistemas GNU/Linux http:codigolibre.org

No hay comentarios:

Publicar un comentario