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.
Figura 48. Esquema de entrada y salida estándar del ejemplo
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».
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 |