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 @ wikipedia.org (en)” 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 -$((begin_pos+size+1)) $file | tail -$((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 -$((380+343+1)) awstats072008.girino.org.txt | tail -$((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 @ wikipedia.org (en), 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 @ wikipedia.org (pt), cada atividade tem sua ferramenta apropriada, não improvise ferramentas. Pois pra lidar com URLs, quem melhor que PHP @ wikipedia.org (en)? 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 -$((begin_pos+size+1)) $file | tail -$((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.