Tuesday, January 4, 2011

Construyendo una serie de comandos con AWK

Awk es un lenguaje de programación creado para procesar texto de ficheros y flujos de datos muy utilizado en ambientes Unix, y disponible en literalmente todas las distribuciones de GNU/Linux, es más, es mencionado en la Single Unix Specification como una de las utilidades necesarias en todo sistema Unix, este gano popularidad como una manera de añadir mas funcionalidad a las tuberías de Unix; Sed y Awk inspiraron a Larry Wall a escribir Perl.

En este articulo vamos a aprender a utilizar AWK como una forma de construir comandos para ser ejecutados en serie, como por ejemplo; mover todos los ficheros encontrados con el comando locate a un directorio o apagar una serie de clientes windows como explicamos en un articulo pasado.

Para que vayan entendiendo mejor vamos a ir escribiendo el comando por partes, el problema que se plantea es el siguiente.

1) Se necesita copiar todos los ficheros que terminen en "conf" del directorio /etc a la carpeta /home.

Lo primero que tenemos que plantearnos es lo que vamos hacer, en este caso es encontrar todos los ficheros que empiezen con .conf del directorio /etc, esto lo podemos hacer con el comando locate de la siguiente manera:

locate /etc/*conf

Esto nos lanzaria algo parecido a esto:

/etc/adduser.conf
/etc/ca-certificates.conf
/etc/debconf.conf
/etc/deluser.conf
/etc/gai.conf
...

Ahora vamos a construir el comando, el problema nos dice que tenemos que copiar estos ficheros a la carpeta /home, a el comando anterior le añadimos una tuberia y usamos awk de la siguiente manera para construir la serie de comandos:

locate /etc/*conf | awk '{ print "cp -rf "$0" /home"}'

Esto nos lanzaria algo parecido a esto:

cp -rf /etc/adduser.conf /home
cp -rf /etc/ca-certificates.conf /home
cp -rf /etc/debconf.conf /home
cp -rf /etc/deluser.conf /home
cp -rf /etc/gai.conf /home
...

En el comando anterior hemos añadido una tuberia para que la salida del comando locate la mande a la entrada awk, entonces el comando awk ha impreso todas las lineas (Para eso la variable $0) con la cadena "cp -rf " atras, y la cadena "/home" delante, el resultado es una serie de comandos a los cuales solo le faltaria otra tuberia para poder ejecutarlo.

Para ejecutar estos comandos simplemente añadimos otra tuberia y mandamos la salida a el comando bash, para que los ejecute por linea, por ejemplo:

locate /etc/*conf | awk '{ print "cp -rf "$0" /home"}' | bash

Se dirigen a el directorio /home y ven los resultados, guiandonos de este ejemplo podemos hacer de todo, por ejemplo apagar un conjunto de clientes Windows, esto lo hacemos asi:

-Creamos un fichero de texto con las IP de las maquinas a apagar, por ejemplo:

192.168.1.2
192.168.1.3
192.168.1.4

-Ejecutamos el siguiente comando:

cat fichero | awk '{ print "net rpc shutdown -I "$0" -U administrator%puntolibre"}' | bash

-Este comando nos generara y ejecutara los siguientes comandos:

net rpc shutdown -I 192.168.1.2 -U administrator%puntolibre
net rpc shutdown -I 192.168.1.3 -U administrator%puntolibre
net rpc shutdown -I 192.168.1.4 -U administrator%puntolibre

Eso es todo, espero que les haya gustado.

Hasta la proxima, Saludos.



2 comentarios:

Anonymous said...

Buenos dias he intentado apagar las maquinas de esta forma, es mas incluso e intentado apagarlas una a una pero NNO SE APAGAN apesar de que sale "Shutdown of remote machine succeeded" pero no apaga ya revise y puse una i mayuscula pero no hace nada

jose luis | avisos clasificados said...

hola,
habia buscado como construir un comando usando awk para formatear los argumentos... con la sugerencia de agregar una tuberia y enviar la salida a bash el tema esta resuelto...
gracias.
JL

Post a Comment