buscarEnLog.sh

Nombre: buscarEnLog.sh
Autor: Juan José Cerezo Mata (Tigreci)
Origen: Original
Lenguaje: bash
Licencia: GPL V.3
Propósito: Busca la clave incluida como parametro en cualquier log pasado por parametro y muestra las n linas anteriores al resultado y las n posteriores
Dependencias: Versión de grep de GNU (UNIX no dispone del parametro -B, comprobado en solaris 5.8)

Código:

#!/bin/bash
##############################
# buscarEnLog: script para busquedas en log.
#
#   Author:  Juan José Cerezo Mata (Tigreci)
#   version: 0.1
#   date: 09/10/2007
#
##############################
function argsCorrect {
    declare -a param1
    declare -a param2
    param1=$1
    param2=$2
    correcto1=0;
    correcto2=0;

    if [ ${param1:0:1} == "-" ]
    then
    correcto1=1
    else
    correcto1=0
    fi
    if [ ${param2:0:1} == "-" ]
    then
    correcto2=0
    else
    correcto2=1
    fi
    correcto3=$[$correcto1 + $correcto2]
    if [ "$correcto3" == "0" ] || [ "$correcto3" == "2" ]
    then
    valorretorno="1"
    else
    valorretorno="0"
    fi
#       -nu numero
#            Especifica el numero de lineas superiores a
#            la encontrada que se debe mostrar, por defecto
#            su valor es 5.
#        -nl numero
#                Especifica el numero de lineas inferiores a
#                la encontrada que se debe mostrar, por defecto
#                su valor es 5.
#        -filepath rutaarchivo
#                Especifica la ruta y nombre de archivo de log
#                sobre el que buscar.
#        -find clave
    if [ "$valorretorno" == "1" ]
    then
        case $valorretorno in
   "-nu")
             valorretorno="1"
             break;;
           "-nl")
             valorretorno="1"
             break;;
           "-filepath")
             valorretorno="1"
             break;;
           "-find")
             valorretorno="1"
             break;;
   "*")
            .valorretorno="0"
             break;;
esac
    fi
    echo $valorretorno
}
nombreScript="./buscarEnLog.sh"
limsuperior=5 #limite superior de lineas a capturar por defecto
liminferior=5 #limite inferior de lineas a capturar por defecto
ruta=""
clave=""
minparam=4 #numero minimo de parametros cuando el parametro no es --help
maxparam=8 #limite superior de parametros cuando el parametro no es --help
function ExecuteCommands {
    filepath=$1
    pattern=$2
    if [ -z $3 ]
    then
       lup=$limsuperior
    else
       lup=$3
    fi
    if [ -z $4 ]
    then
       ldown=$liminferior
    else
       ldown=$4
    fi
    if [ -f $filepath ]
    then
        if [ -r $filepath ]
        then
           if [ -s $filepath  ]
           then
      #En este punto aparte de las lineas encontradas, hay que guardar el numero de linea correspondiente y hacer un head numero de linea un head sobre el archivo completo y numero de linea y pasarselo por tuberia a grep.
              resultado=`grep $clave $filepath -B $lup -A $ldown`
              echo $resultado
           else
              echo "El fichero $filepath se encuentra vacio."
           fi
        else
          echo "No dispones de permisos de lectura sobre el archivo $filepath"
        fi
    else
       echo "El fichero $filepath no existe o es un directorio"
    fi
#construimos la cadena de comando
     
}
clear
if [ -z $1 ] #comprobabmos que han introducido al menos un parametro
then
   echo
   echo "No ha especificado ning?n parametro."
   echo
   echo "Ejecute ./buscarEnLog --help para mas detalles"
   echo
else
numargs=${#@} #Obtenemos el numero de argumentos que ha introducido el usuario
#Calculamos el resto de la division del numero de argumentos entre 2 si devuelve 0 significa que
#el numero de argumentos es par con lo que cada argumento tiene su valor
if [ "$[($numargs%2)]" == "0" ]
then
numargsbucle=$[$numargs+1] #
declare -a args
declare -a resultadogrep
args=("$@")
i=0
i2=0
if [ "$numargs" -lt "$minparam" ]
then
if [ "$numargs" == "1" ] && [ "$1" == "--help" ]
then
.more ./buscarEnLogHelp
else
echo "Opción incorrecta Ejecute ./buscarEnLog.sh --help para mas detalles"
fi
else
if [ "$maxparam" -lt "$numargs" ]
then
echo "Numero de parametros especificado incorrecto."
echo
echo "Ejecute ./buscarEnLog.sh --help para ver la lista de parametros"
else
#Recorremos todos los parametros introducidos hasta numargsbucle
error="0"
while [ $i -lt $numargs ]
do
argumento1=${args[$i]}
argumento2=${args[$i+1]}
resultado=$[`argsCorrect $argumento1 $argumento2`]
if [ "$resultado" == "1" ]
then
        case $argumento1 in
   "-nu")
             limsuperior=$argumento2;;
           "-nl")
             liminferior=$argumento2;;
           "-filepath")
             ruta=$argumento2;;
           "-find")
             clave=$argumento2;;
esac
else
echo "Parametros incorrectamente introducidos $resultado"
echo
echo "Ejecute ./buscarEnLog.sh --help para ver la lista de parametros"
error="1"
break;
fi
i=$[$i+2]
done
if [ -n $clave ] && [ -n $ruta ] && [ $error == "0" ]
then
ExecuteCommands $ruta $clave $limsuperior $liminferior
else
echo "no han introducido ni clave ni ruta"
fi
fi
fi
else

if [ "$numargs" == "1" ] && [ "$1" == "--help" ]
then
more ./buscarEnLogHelp
else
echo "Numero de parametros especificado incorrecto"
echo
echo "Ejecute ./buscarEnLog.sh --help para ver la lista de parametros"
fi
fi
fi

Ayuda archivo buscarEnLogHelp

-------------------------Ayuda---------------------------------

NOMBRE
    buscarEnLog - Buscar una entrada de log y muestra
    un numero de lineas (5 por defecto) superior e
    inferior a la linea encontrada.

OPCIONES
-nu numero
    Especifica el numero de lineas superiores a
    la encontrada que se debe mostrar, por defecto
    su valor es 5.
-nl numero
Especifica el numero de lineas inferiores a
la encontrada que se debe mostrar, por defecto
su valor es 5.
-filepath rutaarchivo
Especifica la ruta y nombre de archivo de log
sobre el que buscar.
-find clave
Especifica el texto a buscar dentro del log.
    --help
    Muestra este archivo de ayuda.

Ejemplos de uso:

./buscarEnLog.sh -filepath /var/log/kern.log -find Failed -nl 10 -nu 5

esto busca todas las lineas con el texto Failed en el log /var/log/kern.log
y muestra las 5 lineas anteriores a la linea encontrada y las 10 posteriores

Comentarios:
Los parametros -filepath y -find son obligatorios

por defecto el script muestra 5 lineas arriba y 5 abajo, al incluir numeros negativos el script lanzará un error de parametro incorrecto(es innecesario un numero negativo pues existen las opciones -nl y -nu

Lo que no se ha probado es ha añadir mas lineas de las existentes en el archivo, y no se que haria grep en dicho caso.

Lo mas interesante del script es el uso de arrays (vectores) y el analisis exahustivo de parámetros, comprueba la existencia del archivo de log y si se dispone de permiso de lectura, pues todo el código del script sin validar nada seria tan sencillo como hacer lo siguiente

grep clave filepath -B numero_lineas_superiores  -A numero_de_lineas_posteriores