segunda-feira, 2 de julho de 2012

Shell Script: Análise de log

Palavras-chave: Shell Script, Shell, Bash, Análise de log.

O script a seguir tem como objetivo processar um arquivo de log. 

IMPORTANTE: Solicitamos, por gentileza, que mantenham o cabeçalho/comentários que fazem referencia aos autores e sites.

No konsole:

$ vim analise_log.sh

Copie e cole o código abaixo integralmente.

#!/bin/bash
#
# Script para análise de arquivos de log.
#
# Autores: Cleber Moretti - a.k.a. tilt / Flávio Oliveira
# E-mail: 
# www.binarycodec.blogspot.com
# www.slackzine.com.br
# Data: 27/06/2012             Versão: 1.2
#-------------------------------------------------------------------------------
#### Comando
#
# analise_log.sh [OPCAO] ARQUIVO.LOG
#-------------------------------------------------------------------------------
#### Opções
#
# -r [relativo - O número de linhas é substituído pelo valor em % em relação
#         ao total de linhas];
#
# -t [textual - Apresenta o número total de linhas do arquivo e todas as
#        linhas consideradas no processamento];
#       
# -f arquivo - [Retorna apenas a quantidade de linhas que fazem referência
#        ao arquivo (por exemplo: -f figura.jpg)];
#
# -i IP - [Retorna o total de linhas que começam com o endereço especificado].
#-------------------------------------------------------------------------------
#### Exemplos de uso
#
# analise_log.sh ARQUIVO.LOG
#    [Apresenta o número total de linhas do ARQUIVO.LOG]
#
# analise_log.sh -r ARQUIVO.LOG
#    [O resultado será 100%, ou seja, o número total de linhas analisadas]
#
# analise_log.sh -f figura.jpg ARQUIVO.LOG
#    [Apresenta a quantidade de linhas que aparece figura.jpg]
#
# analise_log.sh -r -f figura.jpg ARQUIVO.LOG
#    [Apresenta a porcentagem do número de linhas que contém figura.jpg]
#
# analise_log.sh -i 192.168.0.1 ARQUIVO.LOG
#    [Apresenta o número de linhas originadas pelo IP]
#
# analise_log.sh -f figura.jpg -i 192.168.0.1 ARQUIVO.LOG
#    [Apresenta número de linhas com o IP de origem especificado e que o
#    arquivo pesquisado seja figura.jpg]
#
# analise_log.sh -f -i 192.168.0.1 ARQUIVO.LOG
#    [É exibido uma mensagem de erro, pois -f requer um nome de arquivo]
#
# analise_log.sh -r -f figura.jpg -i 192.168.0.1 ARQUIVO.LOG
#    [Apesenta a porcentagem de linhas que o IP de origem especificado
#    e o arquivo processado seja figura.jpg. Exibe também as linhas
#    que corresponde a pesquisa]
#-------------------------------------------------------------------------------

# Incialização das variáveis para testes.

arg_r=100;
arg_t=100;
arg_f=100;
arg_i=100;

# Verificar se o arquivo de log foi informado.

if [ $# -eq 0 ]; then
    echo "O arquivo de log não foi informado!"
    exit ;
fi

# Armazenar o nome do arquivo a ser analisado.

COUNT=0
for ARG in $*; do
    COUNT=` expr $COUNT + 1 `
done
arquivo=$ARG;

# Dados utilizados durante o código.

total_linhas="`cat $arquivo | wc -l`";

# Condição se não houver argumentos.

if [ $# -eq 1  ] ; then
    echo;echo -n "Quantidade de linhas do arquivo:  $1 = ";cat $1 | wc -l; echo;
    exit;
fi

# Condições com argumentos.

while getopts trf:i: escolha; do
    case "${escolha}" in
        r) arg_r=1;;
        t) arg_t=1;;
        f) arg_f=1;
           argumento_f="${OPTARG}";;
        i) arg_i=1;
           argumento_i="${OPTARG}";
    esac
done

# Análise para termo (f).

if  [ ${arg_f} -eq 1 ]  && [ ${arg_r} -eq 100 ]  && [ ${arg_i} -eq 100 ] ; then
    echo -n "Total de linhas com o termo: ";
    grep "${argumento_f}" $arquivo| wc -l;
fi

# Análise para o termo (r).

if  [ ${arg_f} -eq 100 ]  && [ ${arg_r} ]  && [ ${arg_i} -eq 100 ] ; then
    echo -n "Porcentagem total de leitura: ";
    echo "scale=4; ($total_linhas*100)/$total_linhas" | bc -l    
fi

# Análise para o IP ativo (i).

if  [ ${arg_f} -eq 100 ]  && [ ${arg_r} -eq 100 ]  && [ ${arg_i} ] ; then
    echo -n "Total de linhas originadas pelo IP "${argumento_i}": ";
    cat $arquivo | cut -d - -f 1 > /tmp/teste_ip; grep "${argumento_i}" /tmp/teste_ip | wc -l;
    rm /tmp/teste_ip;
fi

# Análise para os termos (f) e (r).

if [ ${arg_r} -eq 1 ]  && [  ${arg_f} -eq 1 ] && [ ${arg_i} -eq 100 ] ; then
    echo -n "Total de Linhas do arquivo: "; echo $total_linhas;
    echo -n "Quantidade de vezes que o termo foi encontrado: ";
    contador="`grep "${argumento_f}" $arquivo| wc -l`";
    echo $contador;
    echo -n "Porcentagem obtida: ";
    echo "scale=4; ($contador*100)/$total_linhas" | bc -l
fi

# Análise para os termos (f) e (i).

if [ ${arg_f} -eq 1 ]  && [  ${arg_i} -eq 1 ] && [ ${arg_r} -eq 100 ]; then
    if [ -z ${argumento_f} ]; then
        echo "Falta de termo a ser pesquisado, erro no sistema!!!";
else
        echo -n "Quantidade de linhas que possui IP e termo pesquisado: ";
        grep "${argumento_f}" $arquivo > analise_termo;
        grep "${argumento_i}" analise_termo | wc -l ;
    fi
fi

# Análise para termo (f), ip (i) e retornando a porcentagem específica (r).

if [ ${arg_f} -eq 1 ]  && [  ${arg_i} -eq 1 ] && [ ${arg_r} -eq 1 ] && [ ${arg_t} -eq 100 ] ; then
    echo -n "Porcentagem de linhas que possui IP e termo pesquisado no arquivo: ";
    grep "${argumento_f}" $arquivo > analise_termo;
    termo_porcent="`grep "${argumento_i}" analise_termo | wc -l`";
    echo "scale=4; ($termo_porcent*100)/$total_linhas" | bc -l
fi

# Análise para termo (f), ip (i), retornando a porcentagem específica (r) e contagem total de linhas.

if [ ${arg_f} -eq 1 ]  && [  ${arg_i} -eq 1 ] && [ ${arg_r} -eq 1 ] && [ ${arg_t} -eq 1 ]; then
    echo -n "Porcentagem de linhas que possui IP e termo pesquisado no arquivo: ";
    grep "${argumento_f}" $arquivo > analise_termo;
    termo_porcent="`grep "${argumento_i}" analise_termo | wc -l`";
    echo "scale=4; ($termo_porcent*100)/$total_linhas" | bc -l
    echo "------------------------------------------------------"
    echo "Linhas que atendem a pesquisa:"
    echo "------------------------------------------------------"
    echo "`grep "${argumento_i}" analise_termo`"
fi

Salve e saia do editor.

Logado como administrador/root:

# chmod +x analise_log.sh

Para executar:

$ ./analise_log.sh [OPÇÃO] ARQUIVO.LOG
-

Nenhum comentário: