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: Tiago Barcellos Peczenyj
Subject: Re: [shell-script] Cruzar access.log com outro log
Date: Mon, 27 Aug 2007 14:31:34 -0300

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> wrote:
>   On 8/27/07, Adriano Carneiro de Moura <address@hidden> 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/


reply via email to

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