domingo, 5 de junio de 2016

Fundamentales. Redirecciones: stdout y stdin




Algo realmente útil que tienen los comandos, no todos, de Linux/Unix es la posibilidad de redirigir su salida como entrada de otro comando.

stdout, standard output o salida estándar es la más fácil de entender: se refiere a la información que devuelve un comando cuando es ejecutado, si no indicamos otra cosa, a la pantalla o terminal.

stdin, standard input o entrada estándar: aquí la cosa se complica más. Hay que ver cada comando si tiene alguna de sus parámetros habilitados para ser indicados como entrada estándar.

Vamos a ver por ejemplo que nos dice la ayuda del comando cat, para lo cual hacemos man cat en la consola:




En la descripción vemos que concatena el fichero o ficheros indicados en el parámetro FILE o el contenido de la entrada estándar hacia la salida estándar.

Vemos ahora las instrucciones del comando grep:



Nos dice en la descripción que buscará el patrón indicado en el/los ficheros indicados en FILE o en la entrada estándar si no indicamos ningún fichero o indicamos – (guión) como nombre de fichero.

Caso práctico

Supongamos que queremos hacer lo siguiente: visualizar la lista de ficheros modificados en febrero en el directorio /etc.

Para hacer esto necesitamos:
  1. Listar el directorio con el comando ls
  2. Filtrar la lista con los ficheros que fueron modificados en febrero con el comando grep
  3. Visualizar la lista de forma paginada para verla con comodidad con el comando less


Primero vamos a ver cómo no debe de hacerse, pero creo que os ayudará a entender cómo funciona cuando lo hagamos correctamente usando la redirección.

Como funciona, pero NO debe de hacerse

Primer paso: listamos el contenido del directorio y volcamos su stdout a un fichero llamado lista.txt:

ls -l /etc >lista.txt

El comando no devuelve nada, pero si miramos con ls (o ll, o la, etc) el directorio actual veremos lo siguiente:



Se ha generado un fichero con el nombre lista.txt que si miramos con cat, por ejemplo, contendrá la lista de todos los ficheros del directorio /etc

Segundo paso: filtramos el contenido del fichero lista.txt y generamos uno filtrado llamado filtrado.txt:

grep “ feb “ lista.txt > filtrado.txt

Igual que con el comando anterior no veremos nada en la salida del comando pero con ls comprobaremos que se ha generado otro fichero llamado filtrado.txt:



Tercer paso: visualizar el fichero filtrado.txt de una forma cómoda que nos permita paginar y movernos arriba y abajo en su contenido:

less filtrado.txt




Facil, no?...pues no señor@s!: tres pasos, dos ficheros que luego tendremos que borrar porque no nos sirven para nada…

¿Cómo SI debe de hacerse usando redirecciones?

Ahora vamos a hacer lo mismo usando redirecciones. Para redirigir la salida de un comando a otro se usa el carácter pipeline  “|” (con Alt Gr+1).

Primer y único paso: Ejecutamos el listado del directorio, redirigimos al filtro y la salida de este la redirigimos nuevamente al visor:

ls -l /etc|grep “ feb “|less

Resultado, el mismo, pero mucho más elegante y sencillo.



Redirección de stdout a fichero

Aunque lo hemos usado en el ejemplo voy a aclarar cómo se redirige la salida estándar de un comando a un fichero. En este caso no se usa el pipeline, sino el símbolo de mayor que “>”. Hay, llamémoslo, dos formas de usarlo:

  • Si se pone una sola vez, por ejemplo: ls -l > fichero.txt, la salida del comando ls generará un fichero llamado fichero.txt, pero si este fichero ya existía previamente se perderá la información que contenía, es decir, que la nueva información sustituirá a la anterior.
  • Podemos ponerlo dos veces, por ejemplo: ls -l /etc >>fichero.txt. En este caso la salida del comando ls se añadirá al final del fichero, no perdiéndose la información contenida en él previamente y en el caso de que no exista se creará.

En las próximas semanas seguiremos publicando más artículos relacionados con los Básicos de Linux, dado que queremos generar información para los socios que están haciendo los talleres de introducción.


Gracias y nos vemos ...


No hay comentarios:

Publicar un comentario