Analisar log Squid

Publicado por Gustavo Hendrigo Marcon (última atualização em 01/10/2009)

[ Hits: 9.204 ]

Homepage: -

Download logsquidia.sh




Script que lista os 10 IPs que mais consumiram banda em uma certa data.

Para executar o script:

./logsquidia.sh 20090928

Ou seja, data no formato: AAAAMMDD

  



Esconder código-fonte

#!/bin/bash

#-------------------------#
# Gustavo Hendrigo Marcon #
#       ARL208004         #
#  Automação de tarefas   #
#-------------------------#

#----- Testa se foi passada os parâmetros -------------------#
if [ $# -ne 2 ]                        
then                           
   echo                           
   echo "Digite: $0 a data e o caminho do arquivo de log ."   
   echo "Exemplo: $0  20090901 /home/hendrigo/access.log"     
   exit                           
fi                           
#------------------------------------------------------------#

#----- Filtra os 8 caracteres referente a data ----#
data=$(echo $1|egrep '^([0-9]{8})')
#--------------------------------------------------#

#----- Atribui as variáveis -----#
ano=$(echo $data|cut -c1-4)
mes=$(echo $data|cut -c5-6)
dia=$(echo $data|cut -c7-8)
#--------------------------------#

#----- Data a ser filtrada com hora inicial 00:00 -----#
data_ini=$(date -d "$ano-$mes-$dia" "+%s")
#------------------------------------------------------#

# ---- Data a ser filtrada com hora inicial 23:59 ---- #
data_fim=$(date -d "$ano-$mes-$dia 23:59:59" "+%s")
#------------------------------------------------------#

#------------ Valida a quantidade de Dígitos ----------#
if [ "$data" == "" ]
   then echo "Data deve ter 8 digitos"
#------------------------------------------------------#

#------------------ Valida ano ------------------------#
elif [ "$ano" -le 2000 -o "$ano" -ge 2010 ]
   then echo "$ano não é ano válido!"
#------------------------------------------------------#

#------------------ Valida mês ------------------------#
elif [ "$mes" -le 0 -o "$mes" -ge 13 ]
   then echo "$mes não é mes válido"
#------------------------------------------------------#

#------------------ Valida dia ------------------------#
elif [ "$dia" -le 0 -o "$dia" -ge 32 ]
   then echo "$dia não é dia válido"
#------------------------------------------------------#

#--------------- Verifica acess.log -------------------#
elif [ ! -f "$2" ] 
   then echo " $2 não é um arquivo ou não existe"
#------------------------------------------------------#

#--------- Verifica permisao em acess.log -------------#
elif [ ! -r "$2" ]
   then echo " Você não tem permissao de leitura em $2"
#------------------------------------------------------#

# ------------------ Se todos parâmetros foram validados, executar --------------------------------------------- #
else
echo "Processando ..."
   {

   # Lista os ips que tiveram acesso durante o periodo, exemplo seguido da pag 81 da apostila #
   ips=$( awk -F" " '$1 >= '$data_ini' && $1 <= '$data_fim' {print $3}' $2 | awk 'BEGIN { } { 
   for (palavra = 1; palavra <= NF; palavra ++)
   quantidade [$palavra] ++
   }
   END { 
   for (palavra in quantidade)
   print palavra 
   }' | sort )
   # ----------------------------- Fim da atribuicao ips ------------------------------------ #

   echo
   echo "========================================================="

   for i in $ips
   do
      # ---- Fitra data e soma os downloads de cada ip, e imprime o resultado ---- #
      awk -F" " '$1 >= '$data_ini' && $1 <= '$data_fim' {print $1,$2,$3}' $2 | grep -w $i | awk -F" " 'BEGIN { } {
         downloads += $2; ip= $3;
    } 
      END {
           printf "%1s %15s %2s %15s %2s %11.3f %2s %2s\n", "|", ip , "|",  downloads, "|", expr downloads / 1000000 , "MB", "|"
    }'
   done | sort -k4 -n | tail -10

   # ---- Se não for encontrado nenhum acesso na data especificada ---- #
   if [ "$ips" == "" ]
   then  echo "Nenhum acesso na data: $1"
   fi

   echo "========================================================="
   echo "|       IP         |    Em Bytes      |      Em MBytes  |"
   echo "|                  |------------------------------------|"
   echo "|  TOP 10, HOSTS   |          TOTAL DE DOWNLOADS        |"
   echo "========================================================="
   echo 
}|tac
#-------------------------------- Fim do if ---------------------------------------------------------------------#
fi

Scripts recomendados

Barra de progresso em shell script com cores roxa e verde

Failover WAN entre dois links

Backup de vários servidores, diferenciado a rotina pela aplicação

Manipulação de contas de email com o postfix

MySamba Server 2.0


  

Comentários
[1] Comentário enviado por danne em 03/11/2009 - 18:55h

Muito bom.

[2] Comentário enviado por smailey em 08/06/2010 - 09:23h

Este scrip é bem util na empresa onde trabalho, porém, quando executo aparece uma mensagem falando que o ano é invalido.
Alguem pode me ajudar ?

[3] Comentário enviado por danne em 10/06/2010 - 08:37h

troque essa parte do script:
#----- Atribui as variáveis -----#
ano=$(echo $data|cut -c1-4)
mes=$(echo $data|cut -c5-6)
dia=$(echo $data|cut -c7-8)

por essa:

#----- Atribui as variáveis -----#
ano=`date +%Y`
mes=`date +%m`
dia=`date +%d`

=]

[4] Comentário enviado por smailey em 11/06/2010 - 11:33h

Danne ainda continua o mesmo problema, 2010 não é ano válido!

;]

[5] Comentário enviado por danne em 11/06/2010 - 22:09h

Opa!! Arruma esse trecho do código:

#------------------ Valida ano ------------------------#
elif [ "$ano" -le 2000 -o "$ano" -ge 2010 ]
then echo "$ano não é ano válido!"
#------------------------------------------------------#

e muda o ano limite:

#------------------ Valida ano ------------------------#
elif [ "$ano" -le 2000 -o "$ano" -ge 2030 ]
then echo "$ano não é ano válido!"
#------------------------------------------------------#

mude para o ano que achar melhor, hehehe. Ele estava comparando se o ano estava entre 2001 a 2009, como estamos em 2010 ele ficaria de fora da lista. =P

[6] Comentário enviado por danne em 11/06/2010 - 22:10h

Outra coisa, agora que fui reparar que ele recebe a data como parâmetro.

Volte esse trecho para o original:
#----- Atribui as variáveis -----#
ano=$(echo $data|cut -c1-4)
mes=$(echo $data|cut -c5-6)
dia=$(echo $data|cut -c7-8)
#--------------------------------#

Esquece aquele meu primeiro post pedindo para usar o comando date. Confundi, hehe.

[7] Comentário enviado por smailey em 14/06/2010 - 11:16h

Danne funcionou perfeitamente, muito obrigado

=D


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts