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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Cruzar access.log com outro log


From: Flavio Junior
Subject: Re: [shell-script] Cruzar access.log com outro log
Date: Mon, 27 Aug 2007 14:51:06 -0300

Sabia q eu já tinha feito isso...

Procurei no historico da lista e encontrei:
http://www.mail-archive.com/address@hidden/msg03978.html

É exatamente o que voce quer, so muda de ingles pra portugues..

O link pro script q escrevi direto é:

http://pastebin.ca/179891

Espero que isso ajude,


Flávio do Carmo Junior


On 8/27/07, Tiago Barcellos Peczenyj <address@hidden> wrote:
>
>   Ola,
>
> primeiro vamos transformar os 3 awk's em 1
>
> awk '{ $1=gensub("^(\d+)/(\d+)","\\2/\\1",1,$1);
> $8=gensub("http://([^/]+)/.*","\\1",1,$8);
> print $1,$2,$4,$8 }' access.log | sort -u
>
> se bem que, com o FS correto, fica bem mais simples
>
> awk -F '[ /]' '{print $2"/"$1"/"$3,$4,$6,$13}' access.log | sort -u
> 27/08/2007 11:49:43 192.168.0.126 rad.msn.com
> 27/08/2007 11:49:44 192.168.0.126 rad.msn.com
> 27/08/2007 11:56:22 192.168.0.126 www.orkut.com
> 27/08/2007 12:00:22 192.168.0.126 rad.msn.com
> 27/08/2007 12:07:00 192.168.0.126 sb.google.com
>
> A parte 'complexa' fica na analise dos horarios de entrada e saida de
> cada usuario.
>
> O que eu poderia sugerir...
>
> Acredito que se os dados dos usuarios forem alterados para este formato:
>
> awk -F '[ :/]' '{t=mktime($5" "$4" "$3" "$6" "$7" "$8); print
> t,$9,$2,$1}' users.log | sort -n
> 1188222050 10.3.16.131 entrou JOAQUIM
> 1188223681 10.3.16.131 saiu JOAQUIM
>
> awk -F '[ /:]' '{t=mktime($3" "$1" "$2" "$4" "$5" "$6); print
> t,$8,$16}' access.log | sort -u
> 1188226183 192.168.0.126 rad.msn.com
> 1188226184 192.168.0.126 rad.msn.com
> 1188226582 192.168.0.126 www.orkut.com
> 1188226822 192.168.0.126 rad.msn.com
> 1188227220 192.168.0.126 sb.google.com
>
> vou dar o caminho das pedras, até pq mais do que isso seria resolver o
> problema inteiro:
>
> o que eu fiz foi usar a função mktime para calcular um numero inteiro,
> um time stamp.
>
> preciso saber agora, para um dado ip, qual é o usuario que estava logado.
>
> vindo do users.log
> timestamp_começo IP FULANO entrou
> timestamp_fim IP FULANO saiu
>
> e no access.log
> timestamp_x IP ...
>
> Eu encontro o fulado quando eu satisfaço esta condição
>
> IP (user.log) == IP (access.log)
> AND timestamp_começo < timestamp_x
> AND timestamp_x < timestamp_fim
>
> o grande problema é que eu não posso levar isto ao pe da letra, pelo
> seguinte: se eu conectei com o mesmo IP uma semana antes e uma semana
> depois, isso interfere na pesquisa. teria que fazer algo mais. este
> tipo de problema acontece quando eu oriento os meus registros por
> linha, quando na verdade eu tenho um registro multi-linha.
>
> eu fui claro? relendo pode ter ficado um pouco confuso...
>
> o correto seria eu ter um arquivo assim
>
> IP timestamp_começo timestamp_fim FULANO
>
> eu pensaria em separar os arquivos por IP, criar arquivos
>
> users_IP
>
> cujo conteudo seria
>
> timestamp_começo timestamp_fim FULANO
>
> $ awk -F '[ :/]' '{
> t=mktime($5" "$4" "$3" "$6" "$7" "$8); print t,$2,$1 > "users_"$9}'
> users.log | sort -n
>
> $ cat users_10.3.16.131
> 1188222050 entrou JOAQUIM
> 1188223681 saiu JOAQUIM
>
> $ awk '$2 ~ /entrou/{entrou[$3]=$1}
> $2 ~/saiu/{print entrou[$3],$1,$3 > "new_"FILENAME}' users_*
>
> $ cat new_users_10.3.16.131
> 1188222050 1188223681 JOAQUIM
>
> agora é, dado o ip e o timestamp, vc abrir o arquivo new_users_IP e
> procurar o intervalo correto. teras que usar o getline() em um while
>
> No livro "The AWK programming language" do Aho, Weinberger &
> Kerninghan existe um capitulo sobre "Reports and Databases" -- o caso
> de procurar dados em 2 arquivos seria um caso de um "Natural Join".
>
> Entretanto o problema neste caso está na forma como a informação foi
> espalhada de uma forma não trivial, recomendo algumas horas ajudando
> um bom AWK para chegar em um resultado satisfatório.
>
> Podem existir alternativas? Sim, devem haver ferramentas que, se
> utilizadas corretamente, devem prover a mesma informação, porém não as
> conheço com a profundidade adequada e, para mim, isso é uma tarefa
> para o AWK ;-)
>
> On 8/27/07, Adriano Carneiro de Moura 
> <address@hidden<adrianodemoura%40yahoo.com.br>>
> wrote:
> > On 8/27/07, Adriano Carneiro de Moura 
> > <address@hidden<adrianodemoura%40yahoo.com.br>>
> wrote:
> > >
> > > pessoal,
> > >
> > > estou usando um proxy transparente e preciso fazer um relatório de
> usuário/ip/site, aconte que o nome dos usuários estão em outro log,
> diferente do access.log, e preciso cruzar os dois logs.
> > >
> > > Para tirar a linha no access.log estou usando o seguinte comando.
> > >
> > > cat /var/log/squid/access.log | awk '{print $1,$2,$4,$8}' | awk -F"/"
> '{print $1,$2,$3,$5}' | awk '{print $1,$2,$3,$4,$5,$7}' | sort -u
> > > obtenho o seguinte resultado:
> > > 27 08 2007 10:43:31 10.3.16.131 www.google.com.br
> > > 27 08 2007 10:43:43 10.3.16.92 www.netveiculos.com.br
> > > 27 08 2007 10:43:45 10.3.16.92 www.netveiculos.com.br
> > >
> > > Desta forma eu tenho data/Hora/Ip/Site
> > >
> > > eu preciso acrescentar mais uma coluna neste relatório, informando o
> Usuario, para ficar assim:
> > > JOAQUIM 27 08 2007 10:43:31 10.3.16.131 www.google.com.br
> > > JOSE 27 08 2007 10:43:43 10.3.16.92 www.netveiculos.com.br
> > > JOSE 27 08 2007 10:43:45 10.3.16.92 www.netveiculos.com.br
> > >
> > > o problema é que o nome do usuário está em outro log, deste jeito:
> > > JOAQUIM entrou 27/08/2007 10:40:50 10.3.16.131
> > > JOAQUIM saiu 27/08/2007 11:08:01 10.3.16.131
> > >
> > > Além de buscar o usuário em outro log, tenho que verificar o IP e data
> de entrata/saída.
> --
> Tiago B Peczenyj
> Linux User #405772
>
> http://peczenyj.blogspot.com/
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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