Uso de Pipes en Linux
Table of Contents
ToggleIntroducción
Cuando hablamos sobre el uso de Pipes en Linux, también llamados tuberías, nos referimos a aquella función que nos permite redireccionar la salida estándar de un comando hacia la entrada de otro, logrando de este modo, ejecutar dos o más comandos en una misma línea.
Ejemplos:
$ ls /home/usuario/Documentos | wc
En este ejemplo se pasa el resultado del comando ls al comando wc el cual muestra la cantidad de líneas, palabras y letras.
Otro ejemplo:
$ cat /etc/passwd | more
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
…
Otro ejemplo combinando varios comandos:
$ cat /etc/passwd | sort | more
arcade:x:109:122:Avahi mDNS daemon,,,:/var/run/arcade-daemon:/bin/false
backup:x:34:34:backup:/var/backups:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
costos-ventas:x:1001:1001:brasil,,,:/home/costos-ventas:/bin/bash
clamav:x:111:124::/var/lib/clamav:/bin/false
…
En este caso el contenido del archivo passwd es pasado al sort , el cual lo ordena alfabéticamente, por último pasa al comando more que pondrá pausa para poder paginar el resultado.
Comando tee
El comando tee lee desde el STDIN, escribe en el STDOUT y al mismo tiempo en uno o más archivos. Veamos un ejemplo:
# sort /etc/passwd | tee archivo_ordenado.txt | more
En este ejemplo pasa el resultado del cat al comando sort , luego lo toma el tee y lo guarda en un archivo. A su vez, la salida es mostrada en pantalla y paginada por el more.
Con la opción “ tee -a ” se agregará contenido al final del archivo sin sobreescribirlo.
Comando xargs
Sintaxis:
# xargs (opciones) (comando) (argumentos)
Este comando suele ser una herramienta muy eficaz con respecto al uso de Pipes en Linux. Esto se debe a que su función es tomar como entrada la salida de otro comando, y pasarlo como argumento, siendo echo el comando predeterminado que usa xargs .
Entonces esta herramienta es muy útil cuando un comando nos muestra un error de exceso de argumentos. Por ejemplo, intentar borrar un directorio con miles de archivos ejecutando “rm *” el asterisco expandirá como argumento la totalidad de archivos.
# ls | xargs
# ls | xargs -n 1
El parámetro -n , seguido de un número, indica cuántos parámetros tomará como columna.
De esta manera es como ejecutar:
#echo archivo1
#echo archivo2
…
Si en cambio ejecutara ls | xargs -n 2 es igual que ejecutar:
# echo archivo1 archivo2
# echo archivo3 archivo4
…
En este ejemplo el comando ls pasará el resultado al xargs quien ejecutará el comando echo rm por cada archivo (ejecutará múltiples echo rm , uno por cada archivo).
# ls *.tmp | xargs -n 1 echo rm
rm archivo1.tmp
rm archivo2.tmp
…
¡De esta manera se puede ver el resultado de lo que se va a borrar, sin borrarlo!
Entradas complejas con xargs
Hay casos en los cuales xargs funcionará de manera incorrecta.
Por ejemplo:
# ls -l /tmp/test
total 0
drw-rwxr-x 2 user user 40 ene 31 17:43 ‘Exámenes de ejercicios’
drwxrw-r-x 2 user user 40 ene 31 17:43 ‘Fotos de Evidencias’
drw-rw-r– 2 user user 40 ene 31 17:43 ‘Mis Documentos
Si usamos find y xargs:
# find ./ -type d | xargs file
./: directory
./Exámenes: cannot open `./Exámenes (No such file or directory)
de: cannot open `de’ (No such file or directory)
ejercicios: cannot open `ejercicios’ (No such file or directory)
./Fotos: cannot open `./Fotos’ (No such file or directory)
de: cannot open `de’ (No such file or directory)
Evidencias: cannot open `Evidencias’ (No such file or directory)
./Mis: cannot open `./Mis’ (No such file or directory)
Documentos: cannot open `Documentos’ (No such file or directory)
Este problema se soluciona indicándole tanto a find como a xargs que cada item termina con un caracter nulo en lugar de un espacio:
# find /tmp -name «/sbin» -print0 2>/dev/null | xargs -0 file
# find ./ -type d -print0 | xargs -0 file
./: directory
./Exámenes: directory
./Fotos: directory
./Mis Documentos: directory
Comando cpio
Este comando se usa para crear y extraer archivos, o copiarlos de un lugar a otro. No utiliza compresión por sí solo, para comprimirlo hay que hacerlo con gzip/bzip2. Tener en cuenta que nos referimos a los archivos en el sentido de ‘paquetes de archivos’.
Este comando, a diferencia de tar, trabaja exclusivamente con redireccionamiento y tuberías.
Sintaxis:
cpio –o ([options]) < [filenames ..] > {file}
cpio –p (destination-directory) < [filenames..]
-o Copy-out mode. Este modo se usa para crear un archivo.
-p Copy-pass mode. Solo copia archivos de un lado a otro.
El siguiente ejemplo «Copy-in mode» se usa para copiar todo lo que creamos antes:
cpio –i < {archive}
Ejemplos
Para archivar:
# ls |cpio -ov > /media/extdisk/pruebas.cpio
Archivo1
text1
text2
text3
1 block
El significado del signo ‘>’ significa que volcamos la salida del comando ubicado a la izquierda en el archivo de la derecha.
Para extraer:
# cpio -iv < /media/extdisk/pruebas.cpio
Archivo1
text1
text2
text3
1 block
El significado del signo ‘<’ significa que el comando de la izquierda recibe como argumentos el archivo de la derecha.
# ls –l
total 10
rwxr-xr-x 2 root root 4096 Oct 5 10:13 Archivo1
-r-r–r– 1 root root 0 Oct 5 15:06 text1
-rw-r–r– 1 root root 0 Oct 5 15:06 text2
-r-r–r– 1 root root 0 Oct 5 15:06 text3
Otras opciones importantes del comando cpio son:
-u Sobrescribe archivos existentes al extraer.
-m Preserva los permisos.
-d Como cpio extrae de manera ‘plana’ los archivos, con esta opción respeta la estructura original de directorios del paquete.
La ventaja de este comando con respecto al tar es que se puede tener mayor control, cuando realizamos scripts, sobre los archivos o tipos de archivos que no se desean copiar. Suele combinarse con el comando find. Sin embargo, su uso es menos frecuente que el de tar, ya que este último es mucho más sencillo de usar.