Ya hace un tiempo que no publicamos en el blog. Pero tranquilos, después de unas merecidas vacaciones volvemos con mucha energía. Retomaremos el curso de Bash Scripting hablando de los pipes y las redirecciones de comandos.
Debido a las peticiones que vamos recibiendo por vuestra parte de subir el código que escribimos, vamos a subir este a nuestra cuenta de Github https://github.com/3pies. En ella hemos creado por el momento el siguiente repositorio https://github.com/3pies/bashscripting para los ejemplos de Bash e iremos creando otros con más tutoriales.
Ya que va a estar en un repositorio público podréis hacer un fork del repositorio, y si lo veis necesario, podéis enviarnos los cambios que creáis necesarios. Vamos ya con el tema del artículo.
Los pipes o tuberías están representadas por el caracter | y explicado de una forma muy simple permiten concatenar el resultado de un proceso hacia el siguiente comando. Uno de los ejemplos más simples es leer un archivo paginando. Esto se consigue con el siguiente comando:
$ cat nombre_del_archivo.txt | more
Simplemente estamos leyendo el archivo que le indicamos y con el resultado hacemos un more que paginará.
En este ejemplo hemos concatenado una sola instrucción, pero podemos concatenar una detrás de otra. Supongamos que tenemos un archivo llamado codigos.txt, con una serie de códigos (este archivo lo he incluido en el repositorio). Queremos buscar aquellos que contengan 45, para mayor comodidad queremos ordenarlos, y como tenemos repeticiones de líneas, queremos eliminar estas repeticiones. Para ello podemos ejecutar lo siguiente:
$ grep -i '45' codigos.txt | sort | uniq
El comando grep realiza la búsqueda, le pasa el resultado al comando sort que ordena las líneas, a su vez este resultado se le pasa a uniq que descartará las líneas repetidas.
Si las tuberías nos permitían encadenar resultados de unos comandos hacia otros, las redirecciones lo que hacen es permitirnos enviar estos resultados hacia un archivo o enviar datos de un archivo a un comando para utilizarlos como parámetros.
El paso del resultado de un comando a un archivo se ejecuta con el simbolo mayor que >. Continuando con el ejemplo anterior, podemos hacer que el resultado se envíe a un archivo llamado codigos.procesados.txt de la siguiente forma:
$ grep -i '45' codigos.txt | sort | uniq > codigos.procesados.txt
Esta redirección va a eliminar el contenido del archivo si lo ejecutáis más de una vez, y escribirá el resultado del comando, pero si lo que queréis es añadir al archivo varios resultados deberéis utilizar una doble flecha de mayor que >>, así:
$ grep -i '45' codigos.txt | sort | uniq >> codigos.procesados.txt
Por último, como comenté antes podemos utilizar la redirección en la dirección opuesta, del archivo hacia nuestros comandos. Esto se realiza con el símbolo menor que <. Para ver este caso, vamos a escribir un pequeño programa en bash que recorra nuestro fichero de códigos y haga un echo. Para empezar crearemos un archivo que llamaré sample_stdin.sh. Veamos como queda:
#!/bin/bash
while read t ;
do echo $t ;
done < codigos.txt
En este caso estamos utilizando un bucle while que va a leer cada una de las líneas de nuestro fichero que le pasamos a través del operador menor que <. Y con cada una de las líneas que almacena en $t hace un echo. Es un while muy simple, pero os puede servir para recorrer líneas de ficheros y realizar procesos más complejos con ellas.