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 ficheroquijote.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 congrep
. 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
.