Ir al contenido principal

Intruducción a AWK

Estos días he andado muy activo con el reforzamiento de algunos temas, especialmente los que más me interesan. AWK y Sed han sido, por mucho tiempo, mis herramientas favoritas en la elaboración de estadísticas y reportes. No son especialistas en la presentación de la información (no grafican), pero con algo de imaginación, quedan bastante inteligibles las salidas.

He estado revisando el libro de Sed & AWK de Ardnold Robbins y Dale Dougherty, cuyo contenido hasta ahora me ha parecido excelso. Su estructura y manera de explicar las posibilidades provienen de la experiencia, no de la teoría. Un punto muy bueno por los autores. Es ameno leerlos, los ejemplos se organizan por complejidad/utilidad, explicándolos poco a poco sin que caiga en un man del sistema y que al final la información esté en los terrenos de lo baladí. Recomiendo mucho su lectura, el aprendizaje de estas dos herramientas es vital si desean manejar y entender los registros del sistema y aplicaciones. Su poder radica en la flexibilidad en la extracción de datos con unos cuantos criterios, tarea que podría llevarnos demasiado tiempo si se realiza a mano; o incluso si son duchos en la utilización de lenguajes funcionales.



 
Inspirándome en su trabajo, a continuación quiero poner algunos de sus ejemplos, en los cuales he modificado algunos pasos, no por el hecho que sean insignificantes, sino para que operen con otras entradas y en otros resultados. Es lúdico cuando se repiten los ejemplos y después se modifican para entender la importancia y los resultados de cada componente en el script. Ese es el mejor consejo que puedo darles para que entiendan y almacenen en su cabeza, de memoria, la escritura de scripts.


El siguiente script tomará mi lista de libros en goodreads.com y generará un reporte por autor de los libros que tengo. La salida que produce será con el formato siguiente.

Vicente Garrido Genovés
        Perfiles criminales
Vicente Leñero
        Más gente así
        Los albañiles
Vicente Riva Palacio
        Los cuentos del general
Virgilio Piñera
        Cuentos frios & El que vino a salvarme
Vladimir Ilyich Lenin
        The State and Revolution
Walter Scott
        La viuda de las montañas (Spanish Edition)
W.G. Sebald
        Vertigo
William S. Burroughs
        Junky
William Shakespeare
        Hamlet
        Richard II
Wisława Szymborska
        View With a Grain of Sand: Selected Poems
W. Richard Stevens
        Advanced Programming in the UNIX Environment

Código

#!/bin/sh
awk -F, '{
  print $3 ", " $0
    }' $* |
sort |
awk -F, '
$4 == LastStates {
  print "\t" $3
  }
$4 != LastStates {
  LastStates = $4
  print $4
  print "\t" $3
  }'

Invocamos el anterior código, en caso que se resguarde en un archivo de texto con los permisos de ejecución activos, como:
 
$ byAuthor goodreads_library_export.csv

byAuthor es el nombre que yo lee he dado**


Vamos a desglosar lo que realizamos anteriormente.

awk -F, -> Esto quiere decir que cambiamos el delimitador. Los delimitadores son los que le dicen a AWK qué es una columna. Por defecto, son los espacios en blanco.

sort -> No es parte de AWK, sin embargo, nos permite ordenar por criterios de ascendencia o descendencia algunas columnas. Muy útil. También es factible crear la rutina de AWK que lo haga, pero eso será en otra ocasión.

La mayor parte de la lógica está en las condiciones. En términos generales, se evalúa la columna $4, la cual nos dictaminará si es el mismo autor o no (Por eso es importante ordenar previamente). Si lo es, solo imprime el título del libro, en caso contrario, imprimirá el nuevo autor y el libro. De sobra está decir que éste será siempre la condición ejecutada cuando se inicie el script.

$4 == LastStates {
  print "\t" $3
  }
$4 != LastStates {
  LastStates = $4
  print $4
  print "\t" $3
  }'

Espero que les ayude a extracción y presentación de la información que extraen de los logs. Estaré publicando más cosas de este tema, pero si quieren, en otros temas tengo igualmente el uso de algunos ejemplos más elaborados y más particulares.



Pueden descargar el código y la lista de ejemplos para su puesta en marcha.


Comentarios

Entradas populares de este blog

Ángulo de Corte

El armar un gallo de pulgada es una de las cosas más sujeta a mitos y medias verdades. Este es uno de los muchos temas que los galleros enuncian con una seguridad a prueba de balas.  Hasta el momento no he leído un solo escrito o esquema con detalle científico que tenga conclusiones claras y precisas de lo que sucede en un combate ni la ergonomía que mejor se adapta, todo proviene de un sistema de creencias que, muy en lo personal, me cuesta creer. El ángulo de corte se refiere a la posición de la punta de la navaja con respecto al codo de la pata. Dependiendo del amarrado es que la sitúa en un rango de los 5° a los 9°. De lo que no dudo es que no hay una manera precisa de emitir teorema alguno sobre este rubro. La formula del corte está dada por la sujeción de la navaja, la forma de la navaja, la altura de la botana, la posición de disparo del gallo, así como la calidad y aprendizaje del mismo durante el desarrollo de la pelea. Son muchas las variables, sin emba...

Análisis de conexiones TIME_WAIT

El tema de las conexiones mal utilizadas es un dolor de cabeza para muchos administradores de servidores de aplicaciones. Es común que las aplicaciones que mantenemos en nuestro resguardo sufran degradación, e incluso fallos, por el "simple" hecho de no cerrar las conexiones o tardar demasiado en hacerlo (vía sistema operativo). Como sabemos, una conexión pasa por varios estados, mismos que salen de la intención de este escrito. Las conexiones establecidas (ESTABLISHED) son demasiado costosas cuando abren y cierran, debido a eso, se han creado manejadores de conexiones (pooles) que mantienen abiertas las conexiones para reutilizarlas dependiendo la demanda. Es por eso, que en medida de lo posible, hay que utilizar un manejador de conexiones, ya sea a base de datos o algún broker. Entrando de lleno al tema, las conexiones en estado TIME_WAIT son un problema por el consumo de memoria, ocupando cada una 64k de memoria no paginable, es decir,  todo el tiempo se mantiene...

Significado de los dígitos de versión del kernel Linux

Algunas de las cosas que siempre quise saber, pero nunca me hice del tiempo para investigarlo es la función de los cuatro dígitos del kernel Linux. Su significado poco tiene que ver con hechos cabalísticos o confusos enunciados matemáticos. Mejor que en mis palabras están las de Tanenbaum: Los números de versión de Linux consiste en cuatro números, A.B.C.D, como 2.6.9.11. El primer número indica la versión del kernel. El segundo indica la revisión mayor. Antes del kernel 2.6 los números pares correspondían a versiones estables del kernel, mientras que los impares correspondían a versiones inestables que estaban en desarrollo. Después del kernel 2.6 los significados se manejaron de forma distinta. El tercer número corresponde a la revisión de versiones menores, como la aceptación de drivers. El cuarto número corresponde a las correcciones de errores menores o parches de seguridad.  Como ven, el señor Tanenbaum es sumamente lacónico con la explicación de los dígitos que compo...