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 <[EMAIL PROTECTED]> wrote: > On 8/27/07, Adriano Carneiro de Moura <[EMAIL PROTECTED]> 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/