14Aug

Facilmente analisar / search cordas de consulta de pesquisa de uma página web a partir apache logs usando awk php e utilitários de linha de comando do Linux sed

6 Peças: Usar awk e sed para analisar arquivos de log do Apache para consultas de pesquisa digitado usuário conhecido Problemas Versão 2: Menos de pré-processamento linha de comando e mais processamento php ToDo dicas truques & amp;Avisos Comentários

Este guia irá mostrar-lhe como facilmente na linha de comando Linux analisar os arquivos de log do Apache para obter os dados de consulta de pesquisa seqüência de caracteres que os usuários digitam para encontrar sua página em um motor de busca.Eu incluí um GUI pesquisa php, bem como para o uso fácil.

Esta informação foi útil?Sim |Não |Preciso de ajuda
Conteúdo
  • 1 Use awk e sed para analisar arquivos de log do Apache para digitado usuário consultas de pesquisa
  • 2 Conhecido Problemas
  • 3 Versão 2: Menos de pré-processamento linha de comando e mais processamento php
  • 4 ToDo
  • 5 Dicas Truques & amp;Avisos
  • 6 Comentários
Ad

Use awk e sed para analisar arquivos de log do Apache para digitado usuário consultas de pesquisa

Aqui está o código-prima para fazer o trabalho.Note que $ title2 deve ser substituir por aquilo que você está procurando, mas os espaços são substituídos por "\ +".

Por exemplo: "Como encontrar um grande lollypop" seria "Como \ + a \ + encontrar \ + a \ + big \ + lollypop"

Isso é porque eu pretendo chamar de uma função php, onde eu voupreencher $ title2 como você verá mais tarde.Eu poderia ter colocado o

egrep mais tarde, mas, em seguida, você não terá a opção de buscar tanto o título da página e consultas.Minha versão original apenas procurou consultas, mas eu queria uma função que eu poderia facilmente chamar para uma determinada página e veja todas as consultas que os usuários se digitados ao longo das últimas semanas.

gato /var/log/virtualmin/VisiHow.com_access_log |dados #get do egrep log de acesso "(q | p) =" |#use Apenas registros que provavelmente têm consultas de pesquisa sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Do algumas alterações de formatação e, mais importante mudar todos os espaçosou sublinha a + egrep -I "$ title2" | #search por US $ title2 awk '{print $ 11}' | #extract apenas dados de pesquisa sed 's / p = / q = / ig' | #handle Yahoo p = awk -F 'q =' '{print $ 2}' | #grab todos os dados começando com q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20/ / g; '|#reformat para o formato legível cut -d humana "& amp;"-f 1 |#strip off outros parâmetros awk '{print $ 0 "
"}' #add
quebras de ligação, porque estamos planejando a saída para uma página web

Esta informação foi útil?Sim |Não |Preciso de ajuda

== Vamos criar um invólucro GUI PHP

HTML para este agora ==

Para fazer isso facilmente uso queremos acessar os dados da consulta do usuário a partir de um formulário de pesquisa página web.

queries.php

& lt; title & gt; Consultas do usuário & lt; / title & gt;& Lt; meta name = "robots" content = "noindex" & gt;

& lt; form name = "método sform" = "get" & gt;Pesquisa Título: & lt; size = valor de entrada "80" = "& lt; php echo $ _GET [ 'title']; & gt;?"name = "title" type = "text" & gt;& Lt; valor de entrada = "Pesquisar" type = "submit" & gt;DICA: Você pode usar um título parcial ou mesmo regex como & lt; / form & gt; "Samsung * danos."

Esta informação foi útil?Sim |Não |Preciso de ajuda

$ title = $ _GET [ 'title'];$ Title = preg_replace( "/ como / i", "", $ title);$ Title2 = str_replace( "", "\ +", $ title);$ Title2 = str_replace( "_", "\ +", $ title2);

$ bigcmd = & lt; & lt; & lt; eof

egrep -i "(q | p) =" |#use Apenas registros que provavelmente têm consultas de pesquisa sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Do algumas alterações de formatação e, mais importante mudar todos os espaçosou sublinha a + egrep -i "$ title2" | #search para awk title2 '{print $ 11}' | #extract apenas dados de pesquisa sed 's / p = / q = / ig' | #handle yahoo p = awk -F'q =' '{print $ 2}' | #grab todos os dados começando com q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20 // g; '|#reformat para o formato legível cut -d humana "& amp;"-f 1 |#strip off outros parâmetros awk '{print $ 0 "
"}' #add
quebras de ligação, porque estamos planejando a saída para uma página web

EOF;

Esta informação foi útil?Sim |Não |Preciso de ajuda

se "{print

Procurando por" $ title "..."( $ title = "!)";print "semana em curso. ..
";print `/var/log/virtualmin/visihow.com_access_log gato |dados #get do log de acesso $ bigcmd `;// Apoiamos p = também porque yahoo usa esse. .. pato estranho lol for( $ i = 1; $ i & lt; 6; $ i ++){ print "
$ i semana( s) atrás
";imprimir `/var/log/virtualmin/visihow.com_access_log.$i.gz zcat |dados #get do log de acesso $ bigcmd `;}}

& gt;

Esta informação foi útil?Sim |Não |Preciso de ajuda

& lt; / eof

Conhecido Problemas

O grep é pegar os registros com os dados de referência para que ele está retornando registros indesejados.Por exemplo, se alguém procura por "iPhone" e um usuário estava em uma página de iPhone em seguida, clicar para ir para uma página da Samsung, este código pega o iPhone a partir do referencial e, portanto, inclui que os dados que não deveria.Eu estou trabalhando em versão 2, que faz muito mais e vai corrigir este erro ao mover grande parte da pré-processamento linha de comando em PHP.O código será mais obtuso, mas vai dar dados muito mais úteis e precisas.

Esta informação foi útil?Sim |Não |Preciso de ajuda

Versão 2: Menos de pré-processamento linha de comando e mais processamento php

Esta versão tem as seguintes vantagens / desvantagens:

  • Menos de linha de comando de pré-processamento significa mais código
  • mais php significa mais controle e apresenta
  • ignora várias solicitações duplicadas do mesmo ip
  • Counts várias pesquisas em vez de listá-los várias vezes
  • apresentar uma tendência informações exibindo totais semanais
  • saída éem divs de rolagem para facilitar a visualização de páginas populares
  • Ordenado segundo comprimentos de consulta totalizaram, quais aproximadamente significa que as páginas mais populares mostrar primeira
  • Um pouco rápido e sujo javascript & amp;css para fazer a auto divs expandir para detalhado visualização

& lt; title & gt; usuário consulta & lt; / title & gt;& Lt; meta name = "robots" content = "noindex" & gt;

& lt; form name = "método sform" = "get" & gt;Pesquisa Título: & lt; size = valor de entrada "80" = "& lt; php
if( strlen( $ _ GET [ 'title']) & gt; 0){
echo $ _GET [ 'title'];
} else{
echo "*"; & lt; br = "" type = "text" & gt;} & gt;? "name = "title" / & gt;& Lt; valor de entrada = "Pesquisar" type = "submit" & gt;
DICA: Digite * para ver tudo.Você pode usar um título parcial ou mesmo regex como "Samsung * danos". & Lt; / form & gt;

Esta informação foi útil?Sim |Não |Preciso de ajuda para a função

sortbylen( $ a, $ b){

strlen retorno( $ b) -strlen( $ a);

}

$ title = $ _GET [ 'title'];$ Title = preg_replace( "/ como / i", "", $ title);$ Title2 = str_replace( "", "\ +", $ title);$ Title2 = str_replace( "_", "\ +", $ title2);

$ bigcmd = & lt; & lt; & lt; eof

egrep -i "(q | p) =" |#use Apenas registros que provavelmente têm consultas de pesquisa sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Do algumas alterações de formatação e, mais importante mudar todos os espaçosou sublinha a + awk '{print $ 1 "" $ 7 "" $ 11}' | egrep -i "$ title2" #search para title2

EOF;

esta informação foi útil Sim | Não | preciso de ajuda
?

if( $ title = "!"){ print

"Procurar" $ título "..."; for( $ i = 0; $ i & lt; 6; $ i ++){ if( $ i == 0){ $ searchlogdata = `/var/log/virtualmin/visihow.com_access_log gato | $ bigcmd`;} else{ $ searchlogdata =` zcat /var/log/virtualmin/visihow.com_access_log.$i.gz | $ bigcmd`;} $ searchlogarray = explode( "\ n", $ searchlogdata); foreach( $ searchlogarray quanto $ sdata){ $ logparts = explode( "", $ sdata); $ ip = $ logparts [0]; $ url = $ logparts[1]; preg_match( "/( q | p) =( *).?"( \ & amp; |? $) / ", $ logparts [2], $ corresponde);$ Ss = urldecode( $ matches [2]);$ Ss = str_replace( "+", "", $ ss);if( (strlen( trim( $ ss)) & gt; 3) & amp; & amp;( preg_match( "# http \: \ / \ / # i", $ ss))!){ // manter fora url a partir de pesquisas do siteif( ($ ip = $ lábio) ||( $ ss = $ LSS)!){ $ lábio = $ ip;$ LSS = $ ss;$ Ssdata [ "$ url"] = "$ ss |.";}}} Uasort( $ array, 'sortbylen');foreach( $ ssdata quanto $ key = & gt; $ value){ $ sarr = explode( "|", $ value);foreach( $ sarr como s $){ if( strlen( $ s) & gt; 0) $ s2 [$ s] ++;} Arsort( $ s2);foreach( $ s2 quanto $ key2 = & gt; $ val2){ $ urldata [$ key] [$ i] = "$ val2: $ key2
";.$ Stot [$ key] [$ i] + = $ val2;} Unset( $ s2);} Unset( $ ssdata);} Foreach( $ urldata quanto $ url = & gt; $ weekdata){ print " & lt; a target =" _ blank "href =" $ url "& gt; $ url & lt; / a & gt;
";$ Wk = 0;... Foreach( $ weekdata quanto $ semana){ print "
" $ semana ++ "SEMANA( s) atrás: Total de Pesquisas =" $ stot [$ url] [$ wk-1] "
";.print "& lt; div onmouseover =" this.style.height = 500 "onmouseout =" this.style.height = 100 "& lt; br =" "& gt; & lt; / div & gt; style =" width: 800px; height: 100px; border: 1px solid cinza; overflow: rolar '& gt; $ semana ";}}}

& gt;

Esta informação foi útil?Sim |Não |Preciso de ajuda

& lt; / eof

ToDo

Ordenar por tamanho da consulta como um tipo secundário, com consultas mais longas

primeira

É isso.Gostaria muito de ouvir suas experiências com este código ou sugestões de melhoria.

Dicas Truques & amp;Avisos

  • Nota: Eu apoio p = bem eo q padrão = porque o Yahoo sendo o pato é estranho utiliza p =
  • Version 2 php é mais complexo e eu estava de codificação rápido para algumas das variáveisnomes foram selecionados mal.por favor não reclamar como seu código livre.Mas se você quer consertá-la e documentá-lo e adicioná-lo na wiki como a versão 3, que seria fantástico:) Pay It Forward!
  • Se você tiver problemas com qualquer uma dessas etapas, fazer uma pergunta para obter mais ajuda, ou postar na seção de comentários abaixo.

Comentários

VisiHow acolhe todos os comentários .Se você não quer ser anônimo, registrar ou log in. Ele é gratuito.




Daniel
Autor Destaque
69 artigos Iniciado
2.601 artigo edições
24,290 Pontos
Daniel é um autor caracterizado com VisiHow.Daniel alcançou o nível de "tenente", com 24,290 pontos.Daniel começou 69 artigos e fez 2.601 artigo edições.17.578 pessoas leram contribuições artigo de Daniel.
Peça Daniel
Daniel : Oi, meu nome é Daniel.
Daniel : Posso ajudá-lo com o seu problema sobre "Facilmente analisar / search cordas de consulta de pesquisa de uma página Web a partir apache logs usando awk php e utilitários de linha de comando do Linux sed"?
Aceitar