Fundamentos de la línea de comandos

Teoría: Pipeline

En esta lección vamos a hablar de uno de los conceptos más útiles cuando trabajamos con la terminal en Unix: el pipeline.

¿Qué es un pipeline?

Cuando usamos la terminal, los programas generalmente reciben datos de entrada (lo que se llama STDIN) y entregan un resultado por pantalla (lo que se llama STDOUT).

Un pipeline, o tubería, es una forma de conectar varios comandos en una sola línea, haciendo que lo que produce un programa (su salida) se convierta en la entrada del siguiente.

Visualmente, lo representamos con este símbolo:

|

Este símbolo se llama pipe o tubo, y su función es redirigir la salida de un comando al siguiente.

Ejemplo básico

Imaginemos que tenemos un archivo .bashrc con varias configuraciones. Queremos encontrar todas las líneas que tengan la palabra alias, y de esas, solo las que también tengan la palabra color. Podríamos hacerlo con un comando así:

grep alias .bashrc | grep color

¿Qué está pasando aquí?

  1. grep alias .bashrc: busca todas las líneas que contengan alias.
  2. |: pasa esas líneas como entrada al siguiente comando.
  3. grep color: de esas líneas, deja solo las que también contienen color.

Salida esperada:

# enable color support of handy aliases
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'

Es como si encadenáramos dos filtros: primero uno que atrapa las líneas con alias, y luego otro que deja pasar solo las que también tienen color.

Pipeline

¿Se puede seguir encadenando más comandos?

Claro que sí. Esa es la gracia de los pipelines: podemos seguir conectando más programas sin escribir un solo archivo temporal.

Por ejemplo, esto también es válido:

cat .bashrc | grep alias | grep color

Aquí usamos cat para leer el archivo .bashrc, luego filtramos las líneas con alias, y después aplicamos otro filtro para dejar solo las que tienen color.

Otro ejemplo un poco más completo

cat source | grep Dog | uniq | sort

Vamos a desglosar lo que pasa aquí:

  1. cat source: lee el contenido del archivo source.
  2. grep Dog: de ese contenido, selecciona solo las líneas que contienen la palabra Dog.
  3. uniq: elimina las líneas duplicadas (importante: para que funcione bien, las líneas duplicadas deben estar una al lado de otra).
  4. sort: ordena esas líneas alfabéticamente.

Estos cuatro comandos juntos realizan un proceso más complejo sin que tengamos que escribir código largo o temporales intermedios.

Puedes ver un ejemplo real de este comando en acción aquí:

asciicast

Ventajas del pipeline

Este enfoque tiene muchas ventajas, y hace parte de la filosofía de Unix:

Principio UnixQué significa
Haz una cosa, y hazla bienCada comando tiene una tarea clara y específica
Conecta comandos simplesPuedes usar varios comandos juntos para resolver problemas complejos
Usa texto como interfazAl usar texto plano, es más fácil combinar herramientas diferentes

Los comandos como grep, sort, uniq, wc, entre otros, funcionan muy bien con esta idea porque leen desde STDIN y escriben a STDOUT.

¿Y si no usamos pipe?

Sin pipelines, tendríamos que guardar archivos temporales después de cada paso, algo así:

grep alias .bashrc > salida1.txt
grep color salida1.txt > salida2.txt

Esto es más largo, menos eficiente y más difícil de mantener. Con los pipes todo es más limpio y directo.


Resumen

  • Un pipeline es una cadena de comandos conectados por el símbolo |.
  • Permite enviar la salida de un comando como entrada al siguiente.
  • Es una forma poderosa y simple de procesar datos en la terminal.
  • Los pipelines siguen la filosofía Unix: comandos simples que se combinan entre sí.
  • Comandos como grep, sort, uniq, cat, y muchos otros funcionan muy bien con pipes.
  • Puedes encadenar tantos comandos como necesites.

Este concepto es clave para aprovechar la terminal al máximo. Prueba combinando comandos tú mismo para explorar todo su poder.