Cómo usar pipes en la terminal: conectar comandos paso a paso
Introducción
En la línea de comandos de Unix‑like (Linux, macOS, WSL, etc.) uno de los conceptos más poderosos es el pipe o tubería, representado por el carácter |. Permite tomar la salida estándar (stdout) de un proceso y usarla como entrada estándar (stdin) del siguiente, sin necesidad de archivos intermedios. En este tutorial veremos cómo funciona, qué ocurre en cada etapa y mostraremos ejemplos concretos con la salida esperada, todo en voseo rioplatense.
¿Qué hace exactamente un pipe?
Cuando escribís:
comando1 | comando2
el shell:
- Ejecuta
comando1y captura su stdout. - Ese flujo de bytes se convierte en el stdin de
comando2. - El stderr de ambos comandos sigue yendo a la terminal (a menos que lo redirijas explícitamente).
- El código de salida del pipe es el de
comando2; sicomando1falla perocomando2sigue recibiendo datos, el pipe no se corta automáticamente.
Esto permite construir pipelines (encadenamientos) de proceso tras proceso, cada uno realizando una transformación sencilla.
Sintaxis básica y buenas prácticas
- El pipe no necesita espacios, pero es recomendable ponerlos para legibilidad:
cmd1 | cmd2. - Podés encadenar tantos como queráis:
cmd1 | cmd2 | cmd3 | cmd4. - Si querés capturar también el stderr, usá
2>&1antes del pipe:cmd1 2>&1 | cmd2. - Para guardar el resultado final en un archivo, redirigí después del último pipe:
... | cmdN > salida.txt.
Ejemplo clásico: ls -l | grep .txt
Veamos qué pasa en cada paso.
Paso 1: ls -l
Supongamos que en el directorio actual tenés los siguientes archivos:
archivo.txt
otro.doc
notas.txt
script.py
lectura.txt
Ejecutando ls -l obtenés:
$ ls -l
-rw-r--r-- 1 usuario grupo 0 Sep 24 10:00 archivo.txt
-rw-r--r-- 1 usuario grupo 0 Sep 24 10:00 otro.doc
-rw-r--r-- 1 usuario grupo 0 Sep 24 10:00 notas.txt
-rw-r--r-- 1 usuario grupo 0 Sep 24 10:00 script.py
-rw-r--r-- 1 usuario grupo 0 Sep 24 10:00 lectura.txt
Esta es la salida que el pipe va a tomar como entrada.
Paso 2: grep .txt
grep recibe línea por línea y filtra aquellas que contengan la cadena .txt. La salida esperada es:
$ ls -l | grep .txt
-rw-r--r-- 1 usuario grupo 0 Sep 24 10:00 archivo.txt
-rw-r--r-- 1 usuario grupo 0 Sep 24 10:00 notas.txt
-rw-r--r-- 1 usuario grupo 0 Sep 24 10:00 lectura.txt
Nota: el punto en .txt se interpreta como "cualquier carácter" seguido de txt. Si querés buscar literalmente el punto, deberías escapar o usar -F: grep -F .txt. Pero para el ejemplo básico sirve.
Otros ejemplos útiles
1. Contar líneas de archivos .log
find . -name "*.log" -type f | xargs cat | wc -l
findlista los archivos.xargs catlos concatena y envía su contenido awc -l.wc -lcuenta las líneas y muestra un número.
Salida esperada (ejemplo):
12457
2. Ordenar y eliminar duplicados de una lista de palabras
cat palabras.txt | tr ' ' '\n' | sort | uniq -c | sort -nr
catlee el archivo.trreemplaza espacios por salto de línea, dejando una palabra por línea.sortordena alfabéticamente.uniq -ccuenta cuántas veces aparece cada palabra.- El último
sort -nrordena de mayor a menor frecuencia.
Salida esperada (fragmento):
42 hola
35 mundo
12 prueba
5 ejemplo
3. Mostrar los 5 procesos que más consumen memoria
ps aux --sort=-%mem | head -n 6
ps auxlista todos los procesos con su uso de memoria.--sort=-%memordena de forma descendente por porcentaje de memoria.head -n 6muestra la cabecera más los cinco primeros procesos.
Salida esperada (las primeras líneas):
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 0.2 15.4 1234567 89012 ? Ssl 08:10 0:12 /usr/bin/mi-servicio
...
Encadenando múltiples pipes
Un pipeline puede ser tan largo como necesites. Cada stage transforma el dato y lo pasa al siguiente. Por ejemplo, para obtener solo los nombres de usuario de los procesos que consumen más de 10 % de CPU:
ps aux --sort=-%cpu | awk '$3 > 10 {print $1}' | sort | uniq
Desglose:
ps aux --sort=-%cpu→ lista procesos ordenados por CPU.awk '$3 > 10 {print $1}'→ la tercera columna es %CPU; si supera 10, imprime la primera columna (usuario).sortordena la lista de usuarios.uniqelimina repeticiones.
Redirigir la salida final a un archivo
Si querés guardar ese listado de usuarios en usuarios_top.txt:
ps aux --sort=-%cpu | awk '$3 > 10 {print $1}' | sort | uniq > usuarios_top.txt
Luego podés verificarlo con cat usuarios_top.txt.
Tips y trucos
- Silenciar errores: si no querés que el stderr moleste, redirigílo a
/dev/null:cmd1 2>/dev/null | cmd2. - Uso de
tee: cuando querés ver la salida y además guardarla, insertátee archivoen medio del pipe:cmd1 | tee intermedio.txt | cmd2. - Evitar buffers: algunos comandos (como
sort) esperan recibir toda la entrada antes de producir salida; si necesitás respuesta inmediata, usá versiones--line-bufferedo herramientas comostdbuf -oL. - Pipes y sudo: si el primer comando necesita privilegios, colocá
sudoantes de él:sudo cmd1 | cmd2. El segundo comando se ejecuta con el usuario original, a menos que también le pongassudo.
Conclusión
El operador pipe | es una herramienta fundamental para combinar pequeños comandos especializados y lograr tareas complejas sin escribir scripts extensos. Al entender qué produce cada etapa y qué consume la siguiente, podés construir pipelines claros, eficientes y fáciles de depurar. Practicá con los ejemplos mostrados, variá los filtros y los comandos, y pronto estarás pensando en términos de "flujo de datos" plutôt que de secuencias aisladas.
¡A fluyan esos datos!
DUGLAS MORENO
Comentarios (0)
Sé el primero en comentar.