Tuberías (pipes)

Podríamos representar cada programa como una «caja negra» que tiene una entrada y una salida que se pueden unir entre ellos.

El ejemplo que utilizamos se encuentra esquematizado en la figura 48 siendo la entrada estándar el teclado y la salida estándar «el terminal» o por simplicidad la pantalla.

redireccionio-diagrama-sort

Figura 48. Esquema de entrada y salida estándar del ejemplo

Vamos a suponer un caso ficticio donde necesitamos todas las definiciones de cada palabra en un texto. Primero las ordenamos alfabéticamente, luego utilizamos un comando ficticio llamado diccionario que toma palabras de la entrada estándar y las reescribe junto a su significado en la salida estándar.

Su esquema se ve en la figura 49. En este caso nombramos por separado las entradas y salidas estándares de los dos programas, pero la «unión» entre ambos programas se puede considerar como un sólo «tubo».

redireccionio-diagrama-diccionario

Figura 49. Esquema de entrada y salida estándar del ejemplo 2

En ese tubo, el flujo está en un estado intermedio, donde está ordenado, pero no tiene las definiciones de diccionario.

En la línea de comandos esto se escribe de la siguiente manera:

$ sort | dicccionario

Donde el caracter | representa la conexión entre la salida estándar de un programa y la entrada estándar de otro.

Con este fuerte y simple concepto se pueden concatenar gran cantidad de programas como si fuera una línea de producción en serie para generar resultados complejos.

Para mejorar nuestro ejemplo sacaremos las palabras repetidas, antes de mostrarlas con definiciones. Suponiendo que exista un programa llamado sacar-repetidas, la línea de comando sería:

$ sort | sacar-repetidas | diccionario

Simple, utilizando herramientas sencillas logramos algo un poco más complicado. El inconveniente que tenemos en este ejemplo es que hay que escribir aquello a procesar. Normalmente queremos utilizar archivos como entrada de nuestros datos. Es necesario un comando que envíe a salida estándar un archivo, así se procesa como la entrada estándar del sort y continúa el proceso normalmente. Este comando es cat. La sintaxis es simple cat nombre-de-archivo.

Quedando nuestro ejemplo:

$ cat archivo.txt | sort | sacar-repetidas | diccionario

... crea un glosario de las palabras que se encuentren en archivo.txt

La combinación de comandos es incalculable y brinda posibilidades enormes. Veamos algunos ejemplos.

Ejemplo 31. Uso de Tuberías

En el caso que se quieran buscar procesos con el string http:

$ ps ax | grep http
3343 ?        S      0:00 httpd -DPERLPROXIED -DHAV
3344 ?        S      0:00 httpd -DPERLPROXIED -DHAV
3975 ?        S      0:00 httpd -DPERLPROXIED -DHAV
12342 pts/6   S      0:00 grep http

Si queremos eliminar la ultima linea podemos volver a usar grep con la opcion -v

$ ps ax | grep http | grep -v grep
3343 ?        S      0:00 httpd -DPERLPROXIED -DHAV
3344 ?        S      0:00 httpd -DPERLPROXIED -DHAV
3975 ?        S      0:00 httpd -DPERLPROXIED -DHAV

Se pueden filtrar las líneas que contengan la palabra linux del archivo arch1.txt y luego mostrarlas en un paginador como less

$ cat arch1.txt | grep linux | less

Podemos enviar los resultados por correo a un amigo,

$ cat arch1.txt | grep linux | mail amigo@email.com