[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] analisando logs
From: |
Thobias Salazar Trevisan |
Subject: |
Re: [shell-script] analisando logs |
Date: |
Thu, 24 Apr 2003 16:51:51 -0300 (BRT) |
ae eri,
On Thu, 24 Apr 2003, Listas XTMS wrote:
> USUARIO REMOTO: address@hidden BYTES: 9999 bytes
>
> sendo que:
> 1- Existem centenas de usuários remotos. E usuários remotos são
> adicionados e removidos sem prévio aviso
> 2- o relatório final tem o TOTAL de bytes de todo o parse do log
> para aquele usuário
>
> Complicador:
> Pode acontecer uma situação assim:
>
> Apr 16 07:10:39 linux qmail: 1050487839.319877 new msg 9483
> Apr 16 07:10:39 linux qmail: 1050487839.319877 new msg 9768
> Apr 16 07:10:39 linux qmail: 1050487839.320033 info msg 9483: bytes 10869
> from <> qp 17536 uid 2014
> Apr 16 07:10:39 linux qmail: 1050487839.319877 new msg 1928
> Apr 16 07:10:39 linux qmail: 1050487839.399435 starting delivery 454: msg
> 9483 to remote address@hidden
> Apr 16 07:10:39 linux qmail: 1050487839.320033 info msg 9768: bytes 136 from
> <> qp 17540 uid 2014
> Apr 16 07:10:39 linux qmail: 1050487839.525411 end msg 9483
> Apr 16 07:10:39 linux qmail: 1050487839.399435 starting delivery 455: msg
> 9768 to remote address@hidden
se eu entendi vamos lá.
Como as mensagens não têm ordem. Tu vai ter que ler duas vez o
arquivo.
#!/bin/bash
# pegamos todas as msg diferentes
sed -n 's/.*new \(msg [0-9]\+\)/\1/p' lixo | while read ID; do
# colocamos em A so as linhas referente a msg
A=`cat lixo | sed -n "/$ID/p"`
# se nao tem pelo menos 3 linhas a msg nao veio toda ainda
[ "$(echo "$A" | sed -n '$=')" -lt "3" ] && continue
# pegamos os campos necessarios
addr=$(echo "$A" | awk '/to remote/ {print $14}')
bytes=$(echo "$A" | awk '/info msg/ {print $11}')
echo "USUARIO REMOTO: $addr BYTES: $bytes bytes "
done
depois, para somar por usuário.
Tendo a saída do script acima em um arquivo. ex:
USUARIO REMOTO: address@hidden BYTES: 10869 bytes
USUARIO REMOTO: address@hidden BYTES: 136 bytes
USUARIO REMOTO: address@hidden BYTES: 136 bytes
cat saida_script | sed -n
'/address@hidden/s/.*BYTES: \([0-9]\+\) .*/\1/p' | \
sed ':a;N;s/\n/+/;ta;' | bc
o primeiro sed pega todas as linhas com o email desejado e deixa
só a quantidade de bytes. ex:
136
136
o outro junta tudo na mesma linha separando com o sinal de +.ex:
136+16
por ultimo, entraga pro bc fazer a soma.
Bom, está solução pode ficar lenta dependendo do tamanho do
seu arquivo de entrada. Se ficar, temos que diminuir o número
de vezes que lemos o arquivo.
falow
thobias
-------
echo 24883721290304465999833114447114149701898P | dc
-------
http://www.lcp.coppe.ufrj.br/~thobias
____________________________
|
| Against - HTML Mail
| Against - MS ATTACHMENTS
|
----------------------------