shell-script-pt
[Top][All Lists]
Advanced

[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
|
----------------------------



reply via email to

[Prev in Thread] Current Thread [Next in Thread]