Encadenar y redireccionar

Usando pipes para encadenar órdenes


La verdadera potencia de utilizar comandos de terminal es el poder encadenarlos. Por medio de los pipes o tuberías podemos conectar los resultados de un primer comando con un segundo comando, pudiendo realizar transformaciones en la información con la que trabajamos.

Encadenamiento

Básicamente, para encadenar un comando con otro utilizaremos el pipe: |.

En un artículo anterior vimos que podemos utilizar el comando grep para filtrar en el contenido de un fichero. Sin embargo, también podemos usar grep de esta forma:

$ cat quijote.txt | grep "Sancho Panza"

Este comando es equivalente a grep "Sancho Panza" quijote.txt. En este caso lo que hacemos es lo siguiente:

  • 1️⃣ cat quijote.txt lee el contenido del fichero quijote.txt
  • 2️⃣ Cómo aún quedan comandos, no muestra nada, sino que pasa la info al siguiente comando
  • 3️⃣ De toda esa información, con grep "Sancho Panza" filtra los resultados
  • 4️⃣ Ahora sí, como no quedan más comandos, muestra el texto (ya filtrado)

En este caso, no tiene mucho sentido usar el cat + grep si ya hay una alternativa para hacerlo directamente sólo con grep. En muchos otros casos, no la hay.

Cuando utilizamos encadenamiento de comandos no estamos limitados sólo a dos comandos. Por ejemplo, podemos hacer múltiples encadenamiento, filtrando la información comando a comando. Por ejemplo:

$ ls -lh | grep ".txt" | wc -l

En este caso, estaríamos haciendo lo siguiente:

  • 1️⃣ Mostramos todos los archivos de la ruta actual, línea por línea (en formato largo)
  • 2️⃣ Cómo aún quedan comandos, no muestra nada, sino que pasa la info al siguiente comando
  • 3️⃣ Con grep ".txt" filtramos los ficheros (cada línea) con extensión .txt
  • 4️⃣ Cómo aún quedan comandos, no muestra nada, sino que pasa la info al siguiente comando
  • 5️⃣ Con wc -l contamos el número de líneas

Por lo tanto, el comando con múltiples encadenamientos lo que hace es contabilizar el número de archivos .txt de texto.

Redirección de información

Otra acción muy útil y muy utilizada junto a los encadenamientos es la operación de redirección. Esta operación, principalmente sirve para crear un nuevo archivo con los datos filtrados previamente.

Para realizar una redirección, utilizaremos el símbolo > junto a la ruta del fichero donde guardaremos la información filtrada. Por ejemplo, observa este caso:

$ ls -lh | grep "gato" > gatos.txt
  • 1️⃣ Mostramos los ficheros de la ruta actual, uno por linea
  • 2️⃣ Filtramos sólo las líneas con el texto gato
  • 3️⃣ Guardamos los resultados en un nuevo fichero llamado gatos.txt

En el caso que ya existiera un fichero gatos.txt lo estaríamos sobreescribiendo.

Vista la desventaja del caso anterior, que la redirección sobreescribe el fichero que ya existía, puede interesarnos que la redirección añada la información a lo que ya existía en el fichero, en lugar de sobreescribirlo.

Si esta es nuestra intención, podemos utilizar la redirección de anexo con el símbolo >>:

$ ls -lh | grep "gato" >> gatos.txt

En este caso, si el fichero gatos.txt ya existía y tenía contenido, añadiremos la nueva información al final del archivo.

Puede ocurrirnos en algún caso, que los mensajes que devuelve un comando son mensajes de error, que se tratan de forma especial. Por ejemplo, si ejecutamos el comando grep sin parámetros nos mostrará un error. Si intentamos redireccionarlo ocurrirá esto:

$ grep > error.txt
Modo de empleo: grep [OPCIÓN]... PATRONES [FICHERO]...
Pruebe 'grep --help' para más información.

$ cat error.txt

Comprobaremos que a pesar de hacer redirección, nos muestra el mensaje de error por pantalla y el fichero error.txt se ha creado vacío. Para evitar esto podemos utilizar la redirección de errores con el símbolo &>:

$ grep &> error.txt

$ cat error.txt
Modo de empleo: grep [OPCIÓN]... PATRONES [FICHERO]...
Pruebe 'grep --help' para más información.

Ahora si, observa que ha redireccionado los errores y los ha guardado en el fichero error.txt.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev