14Aug

Enkelt tolka / söka en webbsida sökfråga strängar från Apache loggar med PHP awk och sed linux kommandoraden verktyg

6 delar: Använd awk och sed att tolka apache loggfiler för användar skrivit sökfrågor Kända problem Version 2: Mindre kommandoraden förbehandling och mer php bearbetning ToDo Tips Tricks & amp;Varningar Kommentarer

Detta HowTo visar hur du enkelt på Linux kommandorad tolka Apache loggfiler för att få söksträng frågedata som användarna skriver att hitta din webbsida i en sökmotor.Jag har tagit en php sökning GUI samt för enkel användning.

Var det här till hjälp?Ja |Nej |Jag behöver hjälp
Innehåll
  • en Använd awk och sed att tolka apache loggfiler för användaren skrivit sökfrågor
  • 2 Kända problem
  • 3 Version 2: Mindre kommandoraden förbehandling och mer php bearbetning
  • 4 ToDo
  • 5 Tips tricks & amp;Varningar
  • 6 Kommentarer
Ad

Använd awk och sed att tolka apache loggfiler för användaren skrivit sökfrågor

Här är rå koden för att få jobbet gjort.Observera att $ title2 bör ersätta med vad du letar efter men utrymmen ersätts med "\ +".

Till exempel: "Hur man hittar en stor lollypop" skulle vara "Hur \ + att \ + hitta \ + en \ + stor \ + lollypop"

Detta beror på att jag planerar att ringa från en php funktion, där jag kommerbefolka $ title2 som du kommer att se senare.Jag kunde ha givit egrep

senare men då du inte kommer att ha möjlighet att söka både sidans titel och frågor.Min ursprungliga version bara sökt frågor men jag ville ha en funktion jag kunde enkelt ringa för en viss sida och se alla frågor som användare har skrivit under de senaste veckorna.

cat /var/log/virtualmin/VisiHow.com_access_log |#Get Data från åtkomstlogg egrep "(q | p) =" |#use Endast poster som sannolikt har sökfrågor sed 's /% 22 / "/ g, s /% 20 / + / g; s / _ / + / g;' | #Do några formateringsändringar och viktigast ändra alla utrymmeneller understryker att + egrep -I "$ title2" | #search för $ title2 awk '{print $ 11}' | #extract endast sökdata sed 's / p = / q = / ig' | #handle Yahoo p = awk -F 'q =' '{print $ 2}' | #grab all data som börjar med q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20/ / g; '|#reformat till läsbart format cut -d "& amp;"-f 1 |#strip av andra parametrar awk '{print $ 0 "
"} "#add
länk raster eftersom vi planerar att exportera till en webbsida

Var det här till hjälp?Ja |Nej |Jag behöver hjälp

== Låt oss skapa ett PHP

HTML GUI wrapper för detta nu ==

att göra detta lätt användning vi vill komma åt användarfrågedata från en webbsida sökfunktionen.

queries.php

& lt; title & gt; Användar Frågor & lt; / title & gt;& Lt; meta name = "robots" content = "noindex" & gt;

& lt; formen name = "sform" method = "get" & gt;Sök Titel: & lt; input size = value = "80" "? & Lt; php echo $ _GET [ 'title']; & gt;?"name = "title" type = "text" & gt;& Lt; input value = "Sök" type = "submit" & gt;TIPS: Du kan använda en partiell titel eller ens RegEx som & lt; / Form & gt; "Samsung * skada."

Var det här till hjälp?Ja |Nej |Jag behöver hjälp

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

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

egrep -i "(q | p) =" |#use Endast poster som sannolikt har sökfrågor sed 's /% 22 / "/ g, s /% 20 / + / g; s / _ / + / g;' | #Do några formateringsändringar och viktigast ändra alla utrymmeneller understryker att + egrep -i "$ title2" | #search för title2 awk '{print $ 11}' | #extract endast sökdata sed 's / p = / q = / ig' | #handle yahoo p = awk -F"q = ''{ print $ 2} '| #grab all data som börjar med q = sed' s / q = // g; s / + / / g; s /% 22 /" / g; s /% 20 // g; '|#reformat till läsbart format cut -d "& amp;"-f 1 |#strip av andra parametrar awk '{print $ 0 "
"} "#add
länk raster eftersom vi planerar att mata ut till en webbsida

EOF;

Var det här till hjälp?Ja |Nej |Jag behöver hjälp

om "{

tryck efter" $ titel "..."( $ title = "!)";print "aktuella veckan. ..
";trycket `cat /var/log/virtualmin/visihow.com_access_log |#Get Data från accessloggen $ bigcmd `;// Vi stöder p = också eftersom Yahoo använder det. .. udda anka lol för( $ i = 1, i $ & lt; 6, $ i ++){ print "
$ i VECKA( S) AGO
";skriva ut `zcat /var/log/virtualmin/visihow.com_access_log.$i.gz |#Get Data från accessloggen $ bigcmd `;}

} & gt;

Var det här till hjälp?Ja |Nej |Jag behöver hjälp

& lt; / eof

Kända problem

Den grep plockar upp skivor med hänvisnings data så det återvänder oönskade poster.Till exempel om någon söker på "iPhone" och en användare var på en iPhone sida sedan klickade för att gå till en Samsung sida, plockar denna kod upp iPhone från den remitterande och därmed omfattar det uppgifter som den borde.Jag arbetar på version 2, som gör en mycket mer och kommer att åtgärda det här felet genom att flytta en stor del av kommandoraden förbehandling i php.Koden kommer att vara mer trubbig, men kommer att ge mycket mer användbara och korrekta uppgifter.

Var det här till hjälp?Ja |Nej |Jag behöver hjälp

Version 2: Mindre kommandoraden förbehandling och mer php bearbetning

Denna version har följande fördelar / nackdelar:

  • Mindre kommandorad förbehandling innebär längre kod
  • mer php innebär mer kontroll och funktioner
  • ignorerar flera dubbla förfrågningar från samma IP
  • Räknar flera sökningar i stället för att lista dem flera gånger
  • Visa trender information genom att visa vecko summor
  • utgången äri rullnings Divar för enkel visning av populära sidor
  • Sorterade per fråge längder uppgick, vilket ungefär betyder mer populära sidor först visa
  • lite snabb och smutsig JavaScript & amp;css att göra divs auto expandera för detaljerad visning

& lt; title & gt; Användar Frågor & lt; / title & gt;& Lt; meta name = "robots" content = "noindex" & gt;

& lt; formen name = "sform" method = "get" & gt;Sök Titel: & lt; input size = värde "80" = "& lt; php
if( strlen( $ _ GET [ 'title']) & gt; 0){
echo $ _GET [ 'title'];
} else{
echo "*"; & lt; br = "" type = "text" & gt;} & gt;? "name = "title" / & gt;& Lt; input value = "Sök" type = "submit" & gt;
TIPS: Ange * för att se allt.Du kan använda en partiell titel eller ens RegEx som "Samsung * skada." & Lt; / Form & gt;

Var det här till hjälp?Ja |Nej |Jag behöver hjälp

funktion sortbylen( $ a, $ b){

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

}

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

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

egrep -i "(q | p) =" |#use Endast poster som sannolikt har sökfrågor sed 's /% 22 / "/ g, s /% 20 / + / g; s / _ / + / g;' | #Do några formateringsändringar och viktigast ändra alla utrymmeneller understryker att + awk '{print $ 1 "" $ 7 "" $ 11}' | egrep -i "$ title2" #search för title2

EOF,

Var det här till hjälp Ja | Nej | jag behöver hjälp
?

if( $ title = "!"){

print "Söker efter" $ titel "...", för( $ 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 = explodera( "\ n", $ searchlogdata), foreach( $ searchlogarray som $ sdata){ $ logparts = explodera( "", $ sdata), $ ip = $ logparts [0]; $ url = $ logparts[1], preg_match( "/( q | p) =( *).?"( \ & amp; |? $) / "$ logparts [2], matchar $);$ Ss = urldecode( $ matcher [2]);$ Ss = str_replace( "+", "", $ ss);if( (strlen( trim( $ ss)) & gt; 3) & amp; & amp;( preg_match( "# http \: \ / \ / # i", $ ss))!){ // hålla ut url från plats sökningarif( ($ ip = $ läpp) ||( $ ss = $ LSS)!){ $ läpp = ip $;$ LSS = $ ss;$ Ssdata [ "$ url"] = "$ ss |".}}} Uasort( $ array, "sortbylen ');foreach( $ ssdata som $ key = & gt; $ värde){ $ Sarr = explodera( "|", $ value);foreach( $ Sarr som s $){ if( strlen( $ s) & gt; 0) $ s2 [$ s] ++;} Arsort( $ s2);foreach( $ s2 som $ nyckel2 = & gt; $ val2){ $ urldata [$ key] [$ i] = "$ val2: $ NKL2
";.$ STOT [$ key] [$ i] + = $ val2;} Unset( $ s2);} Unset( $ ssdata);} Foreach( $ urldata som $ url = & gt; $ weekdata){ print " & lt; a target =" _ blank "href =" $ url "& gt; $ url & lt; / a & gt;
";$ Wk = 0;... Foreach( $ weekdata som $ vecka){ print "
" $ wk ++ "VECKA( S) AGO: Antal sökningar =" $ 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; kant: 1px solid grå; overflow: rulla "& gt; $ vecka";}}

} & gt;

Var det här till hjälp?Ja |Nej |Jag behöver hjälp

& lt; / eof

ToDo

Sortera efter fråge längd som en sekundär sortera, med längre frågor första

Det är det.Jag vill gärna höra dina erfarenheter med denna kod eller förslag till förbättringar.

Tips Tricks & amp;Varningar

  • Obs: Jag stöder p = samt och standard q = eftersom Yahoo är den udda anka det är använder p =
  • Version 2 php är mer komplex och jag kodning snabbt så några av de variablernamn valdes dåligt.vänligen inte klaga som dess fria kod.Men om du vill fixa det och dokumentera den och lägga den i wikin som version 3 som skulle vara fantastiskt:) betala det fram!
  • Om du har problem med något av dessa steg, ställa en fråga om mer hjälp, eller lägga i kommentarerna nedan.

Kommentarer

VisiHow välkomnar alla kommentarer .Om du inte vill vara anonym, registrera eller logga in. Det är gratis.




Daniel
Utvalda Författare
69 artiklarna igång
2601 Artikel Edits
24,290 Points
Daniel är presenterad författare med VisiHow.Daniel har uppnått nivån "löjtnant" med 24,290 poäng.Daniel har startat 69 artiklar och gjort 2,601 artikel ändringar.17,578 personer har läst Daniels artikel bidrag.
Fråga Daniel
Daniel : Hej, mitt namn är Daniel.
Daniel : Kan jag hjälpa dig med ditt problem om "Lätt tolka / Sök en webbsida sökfråga strängar från Apache loggar med PHP awk och sed Linux kommandoradsverktyg"?
Acceptera