Hoy me interesó adentrarme un poco en el uso y la utilidad del comando awk en GNU/Linux.
De hecho, es un lenguaje de programación en sí, con una sintaxis muy parecida a C. En Debian (al menos) la implementación e intérprete de awk recibe el nombre de mawk, y se utiliza mayormente para buscar patrones (modelos) en archivos de texto.
Del man page de mawk:
Un programa awk es una secuencia de pares patrón {acción} y definiciones de funciones. Los programas cortos en la línea de comandos generalmente se encierran en comillas simples para evitar que la consola los interprete, mientras que los más largos pueden ser leídos directamente desde un archivo utilizando la opción -f. Los datos de entrada son leídos desde la lista de archivos en la línea de comandos o desde la entrada estándar stdin si la lista es vacía. La entrada se descompone en registros, tal como se determina por la variable de separación de registros, RS. Inicialmente, RS="\n" (salto de línea) y cada fila se considera un registro separado. Cada uno de ellos se compara con el patrón especificado y si concuerda, se ejecuta el programa {acción}.
Un ejemplo: Tengo la siguiente hoja de cálculo en la que se detallan Nombre y Apellido, Usuario, Contraseña, y Email de un cierto grupo de personas (podrían ser un montón de campos y registros más, pero para la demostración estos son suficientes).
Figura 1: Hoja de cálculo
Lo que quiero obtener es la dirección de email de un cierto registro, y mostrarlo junto con el Nombre y Apellido del mismo.
PRIMER PASO: Guardo el contenido de la hoja de cálculo en formato .csv:
Figura 2: Archivo de texto plano
SEGUNDO PASO: Desde la consola ejecuto el siguiente comando (si quisiera los datos mencionados anteriormente para Elvis Tek):
RESULTADO:
Figura 3: Ejecución del comando y resultado
Explicación de la sintaxis del comando:
- -v var=valor asigna valor a la variable var. En este caso (OFS="\t"), se asigna a la variable OFS (Output Field Separator) el valor tabulador, para separar cada campo de la salida (resultado).
- BEGIN La palabra reservada BEGIN indica el comienzo del programa interpretado por awk, el cual puede especificarse en la misma línea del comando o desde un archivo que contenga las instrucciones.
- {FS=","} FS (Field Separator) indica el caracter que se utiliza para separar los campos en el archivo que se toma como entrada (en este caso, ~/pruebas/nombres y usuarios.csv).
- $1=="Elvis Tek" {print $1,$4} Si el primer campo del archivo de entrada contiene la cadena Elvis Tek, devolver los campos $1 y $4, que según se pueden ver en la figura 1, corresponden a Nombre y Apellido, y Email, respectivamente.
Hoy utilicé esto mismo en mi trabajo. La situación era la siguiente: se me dio una planilla de Excel con una lista de licencias activas de cierto programa con detalle por usuario, junto con un montón de campos. Lo que necesitaba hacer era mostrar solamente los nombres de usuario y dirección de email, sin mostrar las licencias asignadas a un determinado usuario genérico para enviarles un aviso de actualización por correo. Hecho en menos de 1 minuto :-).
ResponderEliminar