Buscar este blog

martes, 9 de abril de 2013

Eliminar comentarios en archivos de configuración con grep.

Si es habitual para nosotros trabajar con archivos de configuración en linux o similares, seguramente nos habremos encontrado con algunos muy bien documentados con comentarios.
Esto es muy útil para la inicialización de servicios, pero a la hora de resolver problemas recorrer un archivo con 3000 lineas no es práctico.

Buscando encontré esto que soluciona el problema pero tiene un defecto.

Por ejemplo, trabajando con Squid: /etc/squid/squid.conf
Si hacemos
grep "#" /etc/squid/squid.conf
Nos mostrará en pantalla las lineas del archivo que posean el carácter #.
Ahora si invertimos la búsqueda con -v
grep -v "#" /etc/squid/squid.conf
Mostrará las ubicaciones donde no se encuentre el mismo, incluyendo lineas vacías, lo que "queda feo".

El autor propone limpiar la salida con grep -v "#" /etc/squid/squid.conf | sed -e '/^$/d' que cumple y deja solo las lineas que buscamos con el #.

Prestando un poco de atención, y buscando en Internet surgen 2 cosas:

  1. Si la linea tiene un # en cualquier lugar distinto del inicio no será mostrada, esto es un problema.
  2. NO necesitamos sed, grep es lo suficientemente flexible como para mostrarnos lo que queremos ver.

Ambas se solucionan con esto
grep '^[^#]' /etc/squid/squid.conf

¿Y esto, para que sirve?
En particular lo utilizo para limpiar los archivos y guardar solo las variables y configuraciones activas.
Según el ejemplo anterior 
grep '^[^#]' /etc/squid/squid.conf > squid.conf.limpio
Genera una copia del archivo solo con lo importante y listo para guardar.
Otra opción es crear un script de bash por si nos olvidamos como es el comando; generamos un  documento de texto, lo llamamos sincom.sh y pegamos lo siguiente dentro :

#!/bin/bash
#Uso
#./sincomen.sh archivo_con_comentarios archivo_destino

grep '^[^#]' $1 > $2

Guardamos y le damos permisos de ejecución con chmod +x sincom.sh. 
¡Listo!, ejecutando ./sincom.sh archivo_comentado archivo_limpio  tenemos automatizada la tarea.

Espero sirva.