lunes, 25 de julio de 2011

Extraer logs de un rango de hora

1 comentarios
Seguramente en sus trabajos se habrán visto en la necesidad de extraer logs en un rango dado de hora; es decir, desde las xx hasta las yy.

Este proceso se puede hacer en linux utilizando varios comando como el grep, head, cut, etc. que combinados nos mostrarán lo que andamos buscando.

Como en mi trabajo actual es bastante común esta actividad me he dado a la tarea de crear un script bash para ello. Este es el código fuente que obviamente pueden mejor y/o adaptar a sus necesidades:

#!/bin/bash
## Rango v.1.0
## Genera un log con un rango de hora ingresado
## Autor: Manuel Gonzalez
## http://maengora.blogspot.com

# Forma de usar el script
echo "Con bash: ./rango.sh "

# Solicito la hora inicial y la almaceno en la variable HORA_INICIAL
echo -n "Hora incial hh:mm "
read HORA_INICIAL

# Solicito hora final
echo -n "Hora final hh:mm "
read HORA_FINAL

# Solicito el nombre del log de donde voy a extraer la informacion
echo -n "Nombre del log a analizar "
read archivo

# Solicito el nombre del archivo donde quedara el resultado
echo -n "Nombre del archivo a generar "
read generado

# Esta sentencia me arroja el numero de la fila donde comienza
# la hora inicial y con cut... capturo dicho numero y lo almaceno
# en la variable inicial
inicial=`grep -n $HORA_INICIAL:.*] $archivo | head -1 | cut -d':' -f1`
echo "Inicia en la fila: $inicial"

# Lo mismo que la anterior pero con la hora final
final=`grep -n $HORA_FINAL:.*] $archivo |tail -1 | cut -d':' -f1`
echo "Termina en la fila: $final"

# Esta sentencia busca, copia y genera un archivo nuevo tomando
# como parametros la fila X dada almacenada en la variable (inicial)
# hasta la fila y almacenada en la variable (final)
# y la guarda en un archivo
generar=`cat $archivo | sed -n "$inicial","$final"p > $generado`
echo $generar

echo "Tarea terminada"