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 5esto 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