miércoles, septiembre 26, 2007

Uso de awk

Antes que todo, ¿que es awk? para ello visiten la información de wikipedia =P.
Ahora que ya sabemos, "dentramos a picar", como dicen los maestros, jjaja.

Cierto dia jugando con debian, por cierto caí en el lado obscuro y pase de la version sarge a la sid de un viaje (al principio quedo la cagá, pero weno, jaja) y como podrán sospechar tuve algunos inconvenientes, principalmente quedaron archivos de configuracion de paquetes desinstalados, ¿como supe esto? ejecutando:

Hamunaptra:~# dpkg -l |grep rc

dpkg -l muestra una lista de paquetes instalados en el sistema, si el paquete esta bien instalado la primera columna que muestra lleva el valor ii, algo asi:

ii paquete version descripcion

sino esta instalado o quedan archivos de configuración nos muestra rc, seguido por el nombre del paquete, versión y luego una descripción del mismo, algo mas o menos asi:

rc paquete version descripcion

como en mi caso el buscar por rc (grep rc) de la lista completa de paquetes instalados me arrojo una gran cantidad de paquetes desinstalados pero con archivos de configuracion en mi sistema, aquí, ante la paja de tener que eliminar los archivos uno a uno se me vino a la mente el utilizar la opcion que tiene aptitude para "purgar" los paquetes, (aptitude remove solo elimina el paquete, no sus archivos de configuracion), ya tenia solucionada una parte de lo que queria hacer, ya que al tener el nombre de paquete a eliminar ejecutaria:

Hamunaptra:~# aptitude purge (paquete) -y

la opcion "-y" es para que, cuando pregunta si desdeo eliminar el paquete se responda automaticamente que si, en vez de tener que apretar enter cada vez, automatizando el proceso :P

Como la lista de programas a eliminar era demasiado grande (unos 500 como mínimo) no era gracioso escribir aptitude purge para cada paquete, asi que recorde que habia un programa en debian que podia automatizar esto, el famoso awk.

Ahora debia tener un archivo con la lista de paquetes a eliminar, este lo obtuve asi:

Hamunaptra:~# dpkg -l |grep rc > borrar.txt

Ojo: "grep rc" tambien pone paquetes instalados (con ii al comienzo) porque contienen en la descripcion las letras "rc", pero son pocos asi que los elimine "a mano" antes de seguir:

Hamunaptra:~# nano borrar.txt

y dentro de nano, con el cursor en la linea a eliminar presione Ctrl + K para cada linea con ii al comienzo.
Si no me hubiese dado cuenta de esto podria haber eliminado paquetes que estaban bien instalados en el sistema :S (dejando mas la cantá jajaj)

Luego, Ctrl + X para salir y respondiendo con enter para guardar los cambios realizados.
Ahora la magia :P

Hamunaptra:~# awk -F " " '{print "aptitude purge " $2 " -y"}' borrar.txt >bye.sh

ahora la traducción, la opcion -F " " hace que awk me separe por columnas cada trozo de texto encontrado con un espacio de por medio, con esto la estructura de variables por columna seria asi:
$1= rc $2=
paquete $3= version $4= descripcion

como me interesaba tener el nombre del paquete utilice solo la columna 2 como variable, por eso el $2 dentro del comando, y con " >bye.sh" redireccioné la salida estandar (la pantalla) a un archivo donde guarde lo generado, ahora solo me queda ejecutarlo, para ello le doy permiso de ejecucion, con:

Hamunaptra:~#
chmod +x bye.sh

y lo ejecuto con

Hamunaptra:~#
./bye.sh

dejo que todo trabaje por si solo y voila problema solucionado, ahora queda reconfigurar el sistema con sid pero otro día les cuento que problemas me dio jajajaj.