jueves, octubre 31, 2013

Flujos y redirecciones: Fontaneros de la Shell.

ejemplo de uso del comando more, grep y redireccion
Ejemplo de uso del comando more, grep y redireccion ">"
En esta entrada los comandos y parámetros de los mismos se han señalado en negrita y las palabras interesantes las hemos puesto en cursiva.


Intro:

Ahora que tenemos un poco más clara la estructura de Linux, conocemos sus Shell, y hemos visto cómo ejecutar nuestros primeros comandos en la consola, es hora de dar un vistazo a las redirecciones.

Habitualmente, las entradas de datos en practicamente cualquier S.O. provienen del teclado y la salida se dirige a la pantalla. A este mecanismo de entrada y salida de datos vamos a llamarle flujo.

Veremos como desviar ese flujo de datos para que en lugar de salir por pantalla se dirija a un lugar mejor: Un fichero de texto.
Tambien vamos a intentar canalizar, mediante una tubería (pipe), esa misma salida hacia otro programa.
Teniendo claros estos conceptos, tendrás en tus manos una de las herramientas informáticas más potentes, estarás pisando a fondo el acelerador de tu Shell.


Entradas y salidas estándar:

Existen tres tipos de entradas y salidas de datos, a las que llamamos flujo de datos en la Intro, son estas:

Entrada estándar (stdin) Es la información que enviamos a la consola, generalmente a través del teclado.
Podría ser la introducción de un comando, por ejemplo "ls" o parámetros a un script.

Salida estándar (stdout): Donde se recibe el resultado de los comandos, generalmente la pantalla. Por ejemplo la salida del comando ls, que muestra el contenido del directorio actual:

# ls
adsl_aux.txt   bin   etc    lost+found  proc         srv  var
Error estándar  (stderr) Donde los comandos envían su informe de errores en caso de producirse uno, de ser así, lo veríamos generalmente en la salida estándar.
Ejemplo: Supongamos que ejecutamos el comando ls, pasándole un parámetro que no existe como "-y"

# ls -y
ls: invalid option -- y
Try `ls --help' for more information.

Vemos que nos muestra una información relativa al error, diciendo que el parámetro "-y" no existe y además nos indica como obtener ayuda para ver que parámetros sí existen.




Mostrar un fichero por pantalla:

Supongamos ahora, que tenemos un fichero llamado prueba.txt con diferentes datos que hemos capturado, por ejemplo de un log de un router que hemos conectado al sistema.
Ahora queremos ver en pantalla cual es el contenido de ese fichero. ¿ Como?  muy sencillo, el comando more nos ayuda:

$more prueba.txt

Este comando nos mostrará por pantalla el contenido de prueba.txt.  




Operadores de redirección:

Volvamos ahora a la idea del flujo de datos: el comando more nos muestra un fichero por pantalla, sin embargo vamos a modificar ese flujo: Vamos a enviar el contenido del fichero a otro fichero nuevo. Para ello necesitamos conocer algunos Operadores de Redirección. Por el momento será suficiente con los siguientes:

">"   Crea un nuevo archivo con la salida estándar
">>" Añade datos de salida estándar a un fichero existente .

"<"   Envía el contenido de un fichero dado para ser utilizado como entrada estándar.
"<<" Envia las líneas siguientes para ser utilizadas como entrada estándar.

Así que ya podemos redireccionar la salida por pantalla de more a un fichero:
$more prueba.txt > prueba2.txt

O enviar la salida de ls a un fichero:

 $ls  > prueba2.txt

Atención: Porque el comando anterior sobreescribirá el fichero prueba2.txt dado que lleva ">" para añadir el contenido sin borrar lo anterior, tendríamos que poner ">>"

Así que ya sabemos como redireccionar la salida estándar por pantalla a un fichero nuevo.



Tubería o pipe ( | ):

Nos estaremos preguntando que sentido puede tener ejecutar el comando anterior: $more prueba.txt > prueba2.txt  dado que lo único que hace es desvíar la salida por pantalla a otro fichero que es exactamente igual.

Aparentemente ninguno, así que vamos a darsela: Vamos a pasar la salida estándar de un programa (de un comando) a la entrada estándar de otro, es decir: vamos a canalizar la salida a otra entrada. Esto lo haremos gracias a una tubería, como esta: "|"

El fichero prueba.txt tiene datos del log de un router que tenemos conectado a nuestro PC o en remoto, queremos eliminar de su contenido todas las palabras que formente el texto "admin".
Sabemos que el comando more lista el contenido del fichero, utilizaremos su salida y la canalizaremos con una tubería o Pipe ( | ) a la entrada de otro comando.

Ese otro comando será un filtro. Hablaremos más adelante de ellos. De momento sepamos que hay un comando llamado grep, con un parámetro interesante: "-v".
grep va a filtrar el contenido del fichero de texto ue le pasemos a su entrada.y con "-v" va a eliminar todo lo que forme la cadena "admin" en dicho fichero.

Hasta el momento tenemos los ingredientes:
fichero.txt: Un fichero de texto sin más que contiene los datos del log de un router, por ejemplo.
more fichero.txt, cuya salida por pantalla es el contenido de fichero.txt.
grep, un generoso filtro cuyo parámetro -v nos permitirá eliminar el texto que le indiquemos.
| una tubería o pipe

Por tanto:  # more fichero.txt | grep -v admin va a mostrar por pantalla el contenido de fichero.txt eliminando todo lo que ponga "admin"

Pero nos falta algo, vamos a mover ese resultado a un fichero nuevo con la información filtrada y sin que salga por pantalla:  # more fichero.txt | grep -v  admin > fichero_nuevo_filtrado.txt

 

En resumen:

Hasta aquí la entrada de hoy, esperamos haber aclarado alguna duda pero sobre todo haber animado a alguien a iniciarse en Linux, perdiendo todo el miedo a comandos y consolas.
En la próxima probaremos algun filtro básico, vereis la potencia que tiene la "vieja" consola.

Ah, y ¡No os olvideis de comentar vuestra opinión y cualquier detalle que se os antoje y pueda complementar al artículo.!




No hay comentarios:

Publicar un comentario