Filtrar linhas identicas e parecidas [RESOLVIDO]

1. Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 23/03/2010 - 08:54h

Ola a todos!
Tenho um script que captura os acessos e loga num arquivo, porém as vezes esta logando duplicados, por ex:

23/03/2010 - 07:58:13 AM 192.168.25.2 00:0D:87:A2:37:1A - login.html
23/03/2010 - 08:03:02 AM 192.168.25.2 00:0D:87:A2:37:1A - login.html
23/03/2010 - 08:03:03 AM 192.168.25.2 00:0D:87:A2:37:1A - login.html
23/03/2010 - 08:23:19 AM 192.168.25.2 00:0D:87:A2:37:1A - login.html


Estava logando tambem muitas vezes no mesmo tempo exato, ai consegui filtrar com "sort -u", porém preciso de alguma ideia de como filtrar tambem para não logar sequentemente como esta acontecendo.
Alguem tem alguma idéia?

Grato []´s


  


2. MELHOR RESPOSTA

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 27/03/2010 - 10:02h

Opa! Nem precisa ordenar baseado no ip como disse acima, é só usar o sort -u que nem você fez.

O negócio é deletar os segundos de cada linha, assim as linhas que tiveram o mesmo hh:mm serão iguais,
aí mandamos um sort -u para remover as linha duplicadas:

$ sed -r 's/:[0-9]{2} ([AP]M)/ \1/' | sort -u

Olha aí se funciona. xD

obs: A solução ficou simples, mas você perdeu o campo de segundos de cada linha. Recuperá-los não
é uma tarefa difícil mas seria necessário alguns comandos (ou regexes a mais no sed) para realizar
a tarefa.

Se o campo dos segundos não for importante, então a solucão acima pode ser a mais ideal e uma das mais rápidas porque ela utiliza apenas dois comandos.

Acho que é isso.
t+

3. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 23/03/2010 - 17:58h

Não sei como você captura isso, mas se vc tiver a opção de ao invés de gravar passa o controle para esta rotina (check duplicado), acho que funciona.

Como não sei de onde vem a sua string ... fiz uma leitura num arquivo que chamei de teste.
--------------


check_duplicado ()
{
REG_ATU=`echo $line | cut -c 26-`
if [ "$REG_ATU" = "$REG_ANT" ]; then
echo $line >> arquivo_de_saida
fi
REG_ANT="$REG_ATU"
}

while read line
do
check_duplicado
done < teste


4. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 23/03/2010 - 18:41h

FDMARP mas este método irá excluir apenas linhas identicas?
a parte referente ao LOG do script é:
######
http_request 4
echo $(cat "$HTMLPATH"login.html) | sed "s/%CONTRACT%/$CONTRACT/g" | sed "s/%REMAINING%/$REMAINING/g" | sed "s/%ERROR%/$CERROR/g" | sed s\þ%URLPOST%þ$URLþg
echo "$DIAHOY $REMOTE_ADDR $mac_user - login.html" | sed '$!N; /^\(.*\)\n\1$/!P; D' >> /usr/local/easycaptive/log/accesos.log
cat /usr/local/easycaptive/log/accesos.log | sort -u >/usr/local/easycaptive/log/accesos.log
exit 0
fi

a ante-penultima linha (CAT) coloquei para filtrar e remover as linhas identicas, muitas veses uma conecção do usuario gerava umas 5 linhas no LOG, umas 3 com o mesmo exato tempo, até os segundos, ai com o sort -u esta removendo pelo menos as linhas identicas.
Porém ainda aparecem uns 2, 3 LOGs de cada acesso, com intervalo de poucos segundos.

A minha idéia é +- assim:
Se dos caractéres 14 a 18 (hh:mm) forem iguais logar apenas 1 vez.


5. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 23/03/2010 - 18:47h

então, minha idéia foi a seguinte: eu ignoro o horário e verifico se o resto da mensagem (do ip até o final da linha) for igual ao da mensagem anterior eu desprezo ... até que chegue uma linha diferente.

tente trocar o:
cat /usr/local/easycaptive/log/accesos.log | sort -u >/usr/local/easycaptive/log/accesos.log

por :

check_duplicado ()
{
REG_ATU=`echo $line | cut -c 26-`
if [ "$REG_ATU" = "$REG_ANT" ]; then
echo $line >> /usr/local/easycaptive/log/accesos.tmp
fi
REG_ANT="$REG_ATU"
}

cat /usr/local/easycaptive/log/accesos.log | while read line
do
check_duplicado
done

Se te atender ai a gente dá uma otimizada no todo ...


6. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 24/03/2010 - 14:49h

fdmarp muito bom, de inicio parece que resolveu o problema!
Vou aguardar até amanhã pra dar uma enchina no LOG e dar como realmente solucionado.

Muito obrigado pela ajuda, até amanhã!


7. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 24/03/2010 - 23:11h

Com o sed mesmo dá pra fazer:

$ sed -r 'G; /^.{13}(.{5}).*\n.{13}\1/d; s/\n.*//; h' <arquivo de log>

O sed irá comparar o horário da linha anterior (que foi salvo no buffer de troca)
com o da linha atual. Se os horários forem iguais, então a linha atual é deletada (d) e com
isso ela não é mostrada.

A comparação dos horários é feita com os 5 caracteres após os 13 primeiros
(que é exatamente o horário hh:mm que você falou).

Acho que é isso.
t+


8. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 25/03/2010 - 08:49h

Bom dia
FDMARP de inicio achei que tinha resolvido, mais não.. inclusive voltou a logar linhas identicas tambem:
24/03/2010 - 07:14:32 PM 192.168.63.3 00:90:F5:7B:AE:B2 - login.html
24/03/2010 - 07:14:33 PM 192.168.63.3 00:90:F5:7B:AE:B2 - login.html
24/03/2010 - 07:26:02 PM 192.168.25.2 00:0D:87:A2:37:1A - login.html
24/03/2010 - 07:36:34 PM 192.168.63.2 00:1E:90:DB:3E:1B - login.html
24/03/2010 - 07:44:51 PM 192.168.32.2 00:19:21:44:63:59 - login.html
24/03/2010 - 07:58:09 PM 192.168.13.2 00:23:8B:C0:99:C5 - login.html
24/03/2010 - 08:01:49 PM 192.168.70.2 00:0E:E8:D7:CE:75 - login.html
24/03/2010 - 08:02:05 PM 192.168.70.2 00:0E:E8:D7:CE:75 - login.html



9. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 25/03/2010 - 08:52h

Daemonio mais desta forma, se 2 usuarios diferentes entrarem no mesmo tempo, não ira logar um deles ?
Teria uma maneira de verificar o restante da linha se é igual? se for igual, e o tempo tambem, exclui. se for diferente, e o tempo igual não exclui!

Obrigado pela ajuda!


10. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 26/03/2010 - 16:20h

Agora com a linha com o "sort -u" eliminou uns 30%, ja melhorou demias, mas ainda:
26/03/2010 - 02:53:30 PM 192.168.26.2 00:19:21:9F:E5:8B - login.html
26/03/2010 - 02:53:33 PM 192.168.26.2 00:19:21:9F:E5:8B - login.html
26/03/2010 - 02:53:34 PM 192.168.26.2 00:19:21:9F:E5:8B - login.html
Veja a diferença de poucos segundos, com o SED é possível mas não consegui de jeito nenhum adaptando varias variaveis q vi.

Uma maneira de verificar: Se da coluna 26 ate o final for igual, E entre 17-21 tambem, manter apenas uma das linhas, se for diferente pode logar.

O que o deamon passou é quase isso, tentei adaptar mas não consegui..

Alguem tem outra sugestão??


11. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 26/03/2010 - 19:46h

cara ... desculpa ... acabei invertendo a lógica ... faltou o"!" ...


check_check_duplicado ()
{
REG_ATU=`echo $line | cut -c 26-`
if [ "$REG_ATU" != "$REG_ANT" ]; then
echo $line >> /usr/local/easycaptive/log/accesos.tmp
fi
REG_ANT="$REG_ATU"
}

cat /usr/local/easycaptive/log/accesos.log | while read line
do
check_duplicado
done


12. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 27/03/2010 - 09:40h

Ok, entendi.. tipo, estava olhando aqui que pode ocorrer uma situação em que a pessoa 1 é logada. Aí uma pessoa 2 é logada logo após, e para piorar a pessoa 1 loga de novo. Então teriamos uma linha parecida
com:

24/03/2010 - 07:00:02 PM 192.168.13.2 00:23:8B:C0:99:C5 - login.html
24/03/2010 - 07:00:05 PM 192.168.25.2 00:0D:87:A2:37:1A - login.html
24/03/2010 - 07:00:07 PM 192.168.13.2 00:23:8B:C0:99:C5 - login.html

Aí, se compararmos a linha 1 com a 2, elas seriam diferentes então as duas seriam validadas. Só que a linha 3 é "igual" a linha 1 e diferente da linha 2, sendo que, quando compararmos a linha 2 e 3, ambas seriam validadas. (obs: a linha 3 deveria ser excluída)

Para evitar isso, acho que o único modo mesmo é mandar um sort em seu log baseado no IP do usuário.

Vou tentar resolver aqui, aí depois posto a solução.

A solução do fdmarp está ótima, já deve fazer o que você tá querendo.

t+



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts