Mais "buscas" que cairam aqui.

Sacumé, eu tinha resolvido reviver o blog a partir das buscas interessantes que caiam nele. Pra isso eu precisava listar todas as buscas e encontrar as interessantes. Achar as buscas foi fácil: meu provedor fornece o "awstats" para analisar o tráfego no site e ele separa isso pra mim. Mas pegar da interface dele tava ficando chato porque são muitas, eu queria organizar e analisar antes de escolher "as melhores". Por isso resolvi tratar direto o arquivo de log do awstats.

Como tratar o arquivo de logs do awstats pra extrair as frases de busca

O primeiro passo foi escolher o arquivo. O awstats usa arquivos mensais. Escolhi, claro, o mais recente, afinal é só uma brincadeira. Encontrar lá dentro o que eu queria foi fácil:

$ grep -ni BEGIN_SEARCHWORDS awstats072008.girino.org.txt
380:BEGIN_SEARCHWORDS 343

Ou seja, na começa na linha 380 e se estende por mais 343 linhas. Então vamos extrair essas informações daí, certo? Fiz esse scriptzinho aqui pra isso:

$ file=awstats072008.girino.org.txt;
$ grep_result=`grep -ni BEGIN_SEARCHWORDS $file`;
$ begin_pos=`echo $grep_result | awk -F: '{print $1}'`;
$ size=`echo $grep_result | awk '{print $2}'`;
$ head -$1)begin_pos+size+1 $file | tail -$2)size+2

Podem ver que as 4 primeiras linhas "apenas" processam o tamanho do arquivo para encontrar o inicio e fim do trecho que eu quero extrair. E só a ultima linha faz o trabalho mesmo. Eu poderia ter feito "na mão" e colocado logo:

$ head -$3)380+343+1 awstats072008.girino.org.txt  | tail -$4)343+2

Mas perdia toda a graça de se brincar com linha de comando 😉

Mas ainda tem um detalhe: esses "dados" estão "codificados" para uso em url (urlencoded, para os íntimos), e precisamos decodificar. Eu até pensei em um script perl ou sed ou awk pra isso, mas pra que? Como dizia o João Cupim, meu professor de marcenaria no COLTEC, cada atividade tem sua ferramenta apropriada, não improvise ferramentas. Pois pra lidar com URLs, quem melhor que PHP? Então o que levaria uma dúzia de linhas e prometeria ficar incompleto em perl/sed/awk, vira isto daqui em PHP:

<?php
$line = fgets(STDIN); // reads one line from STDIN
while ($line) {
    echo urldecode($line);
    $line = fgets(STDIN); // reads one line from STDIN
}
?>

E ainda com a garantia do PHP de que vai funcionar e ter atualizações futuras, etc e tal!

Basta lascar isso aí num arquivo "urldecode.php" e chamar:

$ head -$5)begin_pos+size+1 $file | tail -$6)size+2 | php urldecode.php

Et voilá! Seu arquivo de log foi processado com sucesso ;).

No próximo post eu falo sobre as buscas que encontrei.

References   [ + ]

1, 5. begin_pos+size+1
2, 6. size+2
3. 380+343+1
4. 343+2

Leave a Reply