14Aug

Facilmente analizzare / search stringhe di query di ricerca di una pagina web da log di Apache con PHP awk e sed utility a riga di comando di Linux

click fraud protection
6 parti: utilizzare awk e sed per analizzare i file di log di Apache per l'utente digitato query di ricerca Problemi noti Versione 2: Meno riga di comando di pre-elaborazione e una maggiore elaborazione php ToDo suggerimenti trucchi & amp;Avvertenze Commenti

Questa guida mostra come facilmente dalla riga di comando di Linux analizzare i file di log di Apache per ottenere dati relativi alle query stringa che gli utenti digitano per trovare la vostra pagina web in un motore di ricerca.Ho incluso una ricerca GUI php, nonché per uso facile.

È stato utile?Sì |No |Ho bisogno di aiuto
Contenuto
  • 1 Usa awk e sed per analizzare i file di log di Apache per utente ha digitato query di ricerca
  • 2 Problemi noti
  • 3 Versione 2: Meno riga di comando di pre-elaborazione e una maggiore elaborazione php
  • 4 ToDo
  • 5 Tips & Tricks amp;Avvertenze
  • 6 Commenti
annuncio

Usa awk e sed per analizzare i file di log di Apache per utente ha digitato query di ricerca

instagram viewer

Ecco il codice prima per ottenere il lavoro fatto.Si noti che $ title2 dovrebbe essere sostituito da quello che stai cercando, ma gli spazi sono sostituiti con "\ +".

Per esempio: "Come trovare un grande lollypop" sarebbe "Come \ + a \ + trovare \ + a \ + grande \ + lollypop"

Questo è perché ho intenzione di chiamare da una funzione php, dove voglio iopopolare $ Title2, come si vedrà in seguito.Avrei potuto mettere il

egrep tardi, ma poi non si avrà la possibilità di cercare sia il titolo della pagina e le query.La mia versione originale solo cercato di query, ma ho voluto una funzione ho potuto facilmente chiamare per una determinata pagina per vedere tutte le domande che gli utenti hanno digitato nel corso delle ultime settimane.

gatto /var/log/virtualmin/VisiHow.com_access_log |i dati #Get dal egrep log di accesso "(q | p) =" |#use Solo i record che probabilmente hanno query di ricerca sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Non alcune modifiche di formattazione e, soprattutto, cambiare tutti gli spazio sottolinea a + egrep -I "$ title2" | #search a $ title2 awk '{print $ 11}' | #extract solo i dati di ricerca sed 's / p = / q = / ig' | #handle Yahoo p = awk -F 'q =' '{print $ 2}' | #grab tutti i dati che iniziano con q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20/ / g; '|#reformat in formato leggibile taglio -d umano "& amp;"-f 1 |#strip fuori altri parametri awk '{print $ 0 "
"}' #add
collegamento si rompe perché stiamo progettando di uscita a una pagina web

È stato utile?Sì |No |Ho bisogno di aiuto

== Creiamo un wrapper GUI PHP

HTML per questo ora ==

Per fare questo facilmente utilizzo vogliamo accedere ai dati di query utente da un modulo di ricerca pagina web.

queries.php

& lt; title & gt; query degli utenti & lt; / title & gt;& Lt; meta name = contenuto "robot" = "noindex" & gt;

& lt; form name = metodo "sform" = "get" & gt;Cerca Titolo: & lt; ingresso size = valore "80" = "& lt; php echo $ _GET [ 'title']; & gt;?"name = "title" type = "text" & gt;& Lt; valore di input = "Ricerca" type = "submit" & gt;SUGGERIMENTO: È possibile utilizzare un titolo parziale o addirittura regex come & lt; / form & gt; "Samsung * danni."

È stato utile?Sì |No |Ho bisogno di aiuto

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

$ bigcmd = & lt; & lt; & lt; EOF

egrep -i "(q | p) =" |#use Solo i record che probabilmente hanno query di ricerca sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Non alcune modifiche di formattazione e, soprattutto, cambiare tutti gli spazio sottolinea a + egrep -i "$ title2" | #search per title2 awk '{print $ 11}' | #extract solo i dati di ricerca sed 's / p = / q = / ig' | #handle yahoo p = awk -F'q =' '{print $ 2}' | #grab tutti i dati che iniziano con q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20 // g; '|#reformat in formato leggibile taglio -d umano "& amp;"-f 1 |#strip fuori altri parametri awk '{print $ 0 "
"}' #add
collegamento si rompe perché stiamo progettando di uscita a una pagina web

EOF;

È stato utile?Sì |No |Ho bisogno di aiuto

se "{print

Ricerca di" $ titolo "..."( $ title = "!)";print "settimana in corso. ..
";stampa `/var/log/virtualmin/visihow.com_access_log cat |i dati #Get dal log di accesso $ bigcmd `;// Sosteniamo p = troppo perché Yahoo usa che. .. anatra strano lol for( $ i = 1; $ i & lt; 6; $ i ++){ print "$ i
SETTIMANA( i) fa
";stampare `zcat /var/log/virtualmin/visihow.com_access_log.$i.gz |i dati #Get dal log di accesso $ bigcmd `;}}

& gt;

È stato utile?Sì |No |Ho bisogno di aiuto

& lt; / EOF

Problemi noti

Il grep è in ripresa record con i dati di riferimento in modo che sta tornando record indesiderati.Per esempio, se qualcuno cerca "iPhone" e un utente è in una pagina iPhone poi cliccato per andare a una pagina Samsung, questo codice raccoglie l'iPhone dal referrer e, quindi, comprende che i dati che non dovrebbe.Sto lavorando su versione 2, che fa molto di più e sarà risolvere questo bug spostando gran parte della riga di comando di pre-elaborazione in php.Il codice sarà più ottuso, ma darà i dati di gran lunga più utili e precise.

È stato utile?Sì |No |Ho bisogno di aiuto

Versione 2: Meno riga di comando di pre-elaborazione e una maggiore elaborazione php

Questa versione presenta i seguenti vantaggi / svantaggi:

  • Meno riga di comando di pre-elaborazione significa codice più
  • più php significa maggiore controllo e dispone
  • ignora richieste multiple duplicati dallo stesso IP
  • Conti ricerche multiple invece di elencare loro più volte
  • Visualizza trend informazioni visualizzando i totali settimanali
  • uscita èin div scorrevoli per una facile visualizzazione di pagine popolari
  • Ordinati per lunghezze di query pari, il che significa circa le pagine più popolari mostrano prima
  • Un po 'veloce e sporco JavaScript & amp;css per rendere l'auto div espandersi per la visualizzazione dettagliata

& lt; title & gt; Utente Query & lt; / title & gt;& Lt; meta name = contenuto "robot" = "noindex" & gt;

& lt; form name = metodo "sform" = "get" & gt;Cerca Titolo:? & Lt; ingresso size = valore "80" = "& lt; php
if( strlen( $ _ GET [ 'title']) & gt; 0){
echo $ _GET [ 'title'];
} else{
echo "*"; & lt; br = "" type = "text" & gt;} & gt;? "name = "titolo" / & gt;& Lt; valore di input = "Ricerca" type = "submit" & gt;
SUGGERIMENTO: Inserire * per vedere tutto.È possibile utilizzare un titolo parziale o addirittura regex come "Samsung * danni." & Lt; / form & gt;

È stato utile?Sì |No |Ho bisogno di aiuto funzione

sortbylen( $ a, $ b){

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

}

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

$ bigcmd = & lt; & lt; & lt; EOF

egrep -i "(q | p) =" |#use Solo i record che probabilmente hanno query di ricerca sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Non alcune modifiche di formattazione e, soprattutto, cambiare tutti gli spazio sottolinea a + awk '{print $ 1 "" $ 7 "" $ 11}' | egrep -i "$ title2" #search per title2

EOF;

stato utile? Sì | No | ho bisogno di aiuto
?

if( $ title = ""){ print

"Ricerca di" $ titolo "..."; for( $ i = 0; $ i & lt; 6; $ i ++){ if( $ i == 0){ $ searchlogdata = `cat /var/log/virtualmin/visihow.com_access_log | $ bigcmd`;} else{ $ searchlogdata =` zcat /var/log/virtualmin/visihow.com_access_log.$i.gz | $ bigcmd`;} $ searchlogarray = explode( "\ n", $ searchlogdata); foreach( $ searchlogarray da $ sdata){ $ logparts = explode( "", $ sdata); $ ip = $ logparts [0]; $ url = $ logparts[1]; preg_match( "/( q | p) =( *).?"( \ & amp; |? $) / ", $ logparts [2], $ partite);$ Ss = urldecode( $ partite [2]);$ Ss = str_replace( "+", "", $ ss);if( (strlen( trim( $ ss)) & gt; 3) & amp; & amp;( preg_match( "# http \: \ / \ / # i", $ ss))){ // tenere fuori URL dalle ricerche del sitoif( ($ ip = $ labbro) ||( $ ss = $ LSS)!!){ $ labbro = $ ip;$ LSS = $ ss;$ Ssdata [ "$ url"] = "$ ss |.";}}} Uasort( $ array, 'sortbylen');foreach( $ ssdata da $ key = & gt; $ value){ $ Sarr = explode( "|", $ value);foreach( $ Sarr da $ s){ if( strlen( $ s) & gt; 0) $ s2 [$ s] ++;} Arsort( $ s2);foreach( $ s2 da $ key2 = & gt; $ val2){ $ URLData [tasto $] [$ i] = "$ val2: $ key2
";.$ Stot [tasto $] [$ i] + = $ val2;} Unset( $ s2);} Unset( $ ssdata);} Foreach( $ URLData da $ url = & gt; $ weekdata){ print " & lt; a target =" _ blank "href =" $ url "& gt; $ url & lt; / a & gt;
";$ Wk = 0;... Foreach( $ weekdata da $ settimana){ print "
" $ wk ++ "SETTIMANA( i) fa: Totale Ricerche =" $ 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 grigio; overflow: scroll '& gt; $ settimana ";}}}

& gt;

È stato utile?Sì |No |Ho bisogno di aiuto

& lt; / EOF

ToDo

Ordina per lunghezza query come ordinamento secondario, con le query più lunghe

primo

Questo è tutto.Mi piacerebbe sentire le vostre esperienze con questo codice o proposte di miglioramento.

Tips & Tricks amp;Avvertenze

  • Nota: Sono a favore p = come bene e la q di serie = perché Yahoo essendo l'anatra dispari è usa p =
  • versione 2 PHP è più complessa e mi è stato codifica veloce, quindi alcune delle variabiliI nomi sono stati selezionati male.Si prega di non si lamentano come il suo codice libero.Ma se si vuole risolvere il problema e documentare e aggiungerlo nella wiki come versione 3 che sarebbe fantastico:) Pay It Forward!
  • In caso di problemi con uno di questi passaggi, fare una domanda per ulteriori informazioni, oppure inserire nella sezione commenti qui sotto.

Commenti

VisiHow accoglie tutti i commenti .Se non si vuole essere anonima, registrarti o accedere. E 'gratuito.




Daniel
in Primo Piano
69 articoli introduttiva
2.601 Articolo modifiche
24.290 Punti
Daniel è un autore descritto con VisiHow.Daniel ha raggiunto il livello di "tenente", con 24.290 punti.Daniel ha iniziato a 69 articoli e fatto 2.601 modifiche articolo.17,578 persone hanno letto i contributi articolo di Daniel.
Chiedi Daniel
Daniel : Ciao, il mio nome è Daniel.
Daniel : posso aiutarti con il tuo problema di "Facilmente analizzare / cercare stringhe di query di ricerca di una pagina web dal log di Apache con PHP awk e sed utility a riga di comando di Linux"?
Accetta