14Aug
Ce HowTo va vous montrer comment facilement à la ligne de commande Linux analyser vos fichiers de log apache pour obtenir des données de requête de chaîne de recherche que les utilisateurs saisissent pour trouver votre page Web dans un moteur de recherche.J'ai inclus une recherche GUI php aussi bien pour une utilisation plus facile.
- 1 Utilisez awk et sed pour analyser les fichiers journaux apache pour la recherche dactylographié utilisateur interroge
- 2 Problèmes connus
- 3 Version 2: Moins de prétraitement ligne de commande et plus de traitement de php
- 4 ToDo
- 5 Conseils Astuces & amp;Avertissements
- 6 Commentaires
Utilisez awk et sed pour analyser les fichiers journaux apache pour la recherche dactylographié utilisateur interroge
Voici le code brut pour faire le travail.Notez que $ title2 devrait être remplacé par ce que vous cherchez, mais les espaces sont remplacés par "\ +".
Par exemple: "Comment trouver un grand lollypop" serait "Comment \ + à \ + trouver \ + a \ + big \ + lollypop"
Ceci est parce que je prévois de faire appel d'une fonction php, où je vaispeupler $ title2 comme vous le verrez plus tard.Je aurais pu mettre le
egrep plus tard, mais alors vous ne vais pas avoir la possibilité de rechercher à la fois titre de la page et les requêtes.Ma version originale seulement recherché des requêtes mais je voulais une fonction que je pourrais appeler facilement pour une page donnée et de voir toutes les requêtes que les utilisateurs ont tapé au cours des dernières semaines. chat /var/log/virtualmin/VisiHow.com_access_log |données #GET du egrep journal d'accès "(q | p) =" |#use Uniquement les enregistrements qui ont probablement des requêtes de recherche sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Ne quelques changements de mise en forme et surtout changer tous les espacesou souligne à + egrep -I "$ title2" | #search pour title2 $ awk '{print $ 11}' | #extract seulement des données de recherche sed 's / p = / q = ig /' | #handle Yahoo p = awk -F 'q =' '{print $ 2}' | #grab toutes les données commençant par q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20/ / g; '|#reformat au format lisible cut -d humain "& amp;"-f 1 |#strip off autres paramètres awk '{print $ 0 "
"}' #add
lien pauses parce que nous prévoyons de sortie vers une page Web
== Nous allons créer une interface graphique wrapper PHP
HTML pour cela maintenant ==Pour faire cela facilement l'utilisation que nous voulons accéder aux données de la requête de l'utilisateur à partir d'une page Web de recherche.
& lt de
; title & gt; Requêtes utilisateur & lt; / title & gt;& Lt; meta name = "robots" content = "noindex" & gt;
& lt; form name = méthode "SFORM" = "get" & gt;Recherche Titre: lt &; entrée size = valeur "80" = "& lt; php echo $ _GET [ 'title']; & gt;?"name = "title" type = "text" & gt;& Lt; valeur d'entrée = "Recherche" type = "submit" & gt;ASTUCE: Vous pouvez utiliser un titre partiel ou même regex comme & lt; / form & gt; "Samsung * dommages."
$ title = $ _GET [ 'title'];$ Title = preg_replace( "/ comment / i", "", $ titre);$ Title2 = str_replace( "", "\ +", $ titre);$ Title2 = str_replace( "_", "\ +", $ title2);
$ bigcmd = & lt; & lt; & lt; eof
egrep -i "(q | p) =" |#use Uniquement les enregistrements qui ont probablement des requêtes de recherche sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Ne quelques changements de mise en forme et surtout changer tous les espacesou souligne à + egrep -i "$ title2" | #search pour title2 awk '{print $ 11}' | #extract seulement des données de recherche sed 's / p = / q = / ig' | #handle yahoo p = awk -F'q =' '{print $ 2}' | #grab toutes les données commençant par q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20 // g '|#reformat au format lisible cut -d humain "& amp;"-f 1 |#strip off autres paramètres awk '{print $ 0 ""}' #add
lien pauses parce que nous prévoyons la sortie d'une page Web
EOF;
si "{
print Recherche de" $ title "..."( $ title = "!)";print "SEMAINE EN COURS. ..";print `/var/log/virtualmin/visihow.com_access_log chat |données #GET du journal d'accès $ bigcmd `;// Nous soutenons p = aussi parce que yahoo utilise ce. .. canard bizarre lol for( $ i = 1; $ i & lt; 6; $ i ++){ print "
$ i SEMAINE( S) AGO
";imprimer `/var/log/virtualmin/visihow.com_access_log.$i.gz zcat |données #GET du journal d'accès $ bigcmd `;}}
& gt?;
& lt;
de / Problèmes connus
Le grep ramasse des enregistrements avec des données referrer de sorte qu'il est de retour enregistrements indésirables.Par exemple, si quelqu'un cherche "iPhone" et un utilisateur était sur une page iPhone puis cliqué pour accéder à une page Samsung, ce code reprend l'iPhone de l'referrer et comprend donc que les données qui ne devrait pas.Je travaille sur la version 2, qui fait beaucoup plus et va corriger ce bug en déplaçant une grande partie de la pré-traitement de ligne de commande en php.Le code sera plus obtus, mais donnera des données beaucoup plus utiles et précises.
Version 2: Moins de prétraitement de ligne de commande et plus de traitement de php
Cette version présente les avantages / inconvénients suivants: signifie
- Moins ligne de commande pré-traitement plus le code
- plus php signifie plus de contrôle et dispose d'
- Ignore plusieurs demandes en double de la même ip
- Counts recherches multiples au lieu de les énumérer plusieurs fois
- Afficher informations sur les tendances en affichant les totaux hebdomadaires
- sortie estdans divs défilants pour faciliter la visualisation des pages populaires
- Classé selon la longueur de la requête ont totalisé, ce qui signifie environ pages les plus populaires montrent d'abord
- Un peu rapide et sale ampli javascript &;css pour rendre l'auto divs expansion pour la visualisation détaillée
& lt; title & gt; & lt utilisateur Requêtes; / title & gt;& Lt; meta name = "robots" content = "noindex" & gt;
& lt; form name = méthode "SFORM" = "get" & gt;Recherche Titre:? Lt &; entrée size = valeur "80" = "& lt; php
if( strlen( $ _ GET [ 'title']) & gt; 0){
echo $ _GET [ 'title'];
} else{
echo "*"; & lt; br = "" type = "text" & gt;} & gt;? "name = "title" / & gt;& Lt; valeur d'entrée = "Recherche" type = "submit" & gt;
ASTUCE: Entrez * pour tout voir.Vous pouvez utiliser un titre partiel ou même regex comme «Samsung * dommages». & Lt; / form & gt;
sortbylen( $ a, $ b){
retour strlen( $ b) -strlen( $ a);}
$ title = $ _GET [ 'title'];$ Title = preg_replace( "/ comment / i", "", $ titre);$ Title2 = str_replace( "", "\ +", $ titre);$ Title2 = str_replace( "_", "\ +", $ title2);
$ bigcmd = & lt; & lt; & lt; eof
egrep -i "(q | p) =" |#use Uniquement les enregistrements qui ont probablement des requêtes de recherche sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Ne quelques changements de mise en forme et surtout changer tous les espacesou souligne à + awk '{print $ 1 "" $ 7 "" 11 $}' | egrep -i "title2 $" #search pour title2EOF;
if( $ title = ""){
print "Recherche de" $ title "..."; for( $ i = 0; i $ & lt; 6; $ i ++){ if( $ i == 0){ searchlogdata $ = `/var/log/virtualmin/visihow.com_access_log cat | bigcmd` $;} else{ searchlogdata $ =` zcat /var/log/virtualmin/visihow.com_access_log.$i.gz | bigcmd` $;} $ searchlogarray = explode( "\ n", $ searchlogdata); foreach( $ searchlogarray comme sdata $){ $ logparts = exploser( "", $ sdata); $ ip = $ logparts [0]; $ url = $ logparts[1]; preg_match( "/( q | p) =( *).?"( \ & amp; |? $) / ", $ logparts [2], $ correspond);$ Ss = urldecode( $ matches [2]);$ Ss = str_replace( "+", "", $ ss);if( (strlen( trim( $ ss)) & gt; 3) & amp; & amp;( preg_match( "# http \: \ / \ / # i", $ ss))!){ // garder hors URL à partir de recherches du siteif( ($ ip = $ lèvre) ||( $ ss = $ lss)!!){ $ lip = $ ip;$ Lss = $ ss;$ Ssdata [ "$ url"] = "$ ss |".}}} Uasort( $ array, 'sortbylen');foreach( $ ssdata que $ key = & gt; $ value){ $ sarr = explode( "|", $ value);foreach( $ sarr comme s $){ if( strlen( $ s) & gt; 0) $ s2 [$ s] ++;} Arsort( $ s2);foreach( $ s2 que $ key2 = & gt; val2 $){ urldata $ [$ key] [$ i] = "$ val2: $ key2";.$ Stot [$ key] [$ i] + = $ val2;} Unset( $ s2);} Unset( $ ssdata);} Foreach( $ urldata que $ url = & gt; $ weekdata){ print " & lt; a target =" _ blank "href =" $ url "& gt; $ url & lt; / a & gt;
";$ Sem = 0;... Foreach( $ de weekdata que $ la semaine){ print "
" $ sem ++ "SEMAINE( S) AGO: Total recherches =" $ stot [$ url] [sem-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 gris; overflow: scroll '& gt; $ la semaine ";}}}
& gt?;
& lt; / eof
ToDo
Trier par longueur de requête comme une sorte secondaire, avec des requêtes plus longues premier
Voilà.J'aimerais entendre vos expériences avec ce code ou des suggestions d'amélioration.
Conseils Tricks & amp;Avertissements
- Note: Je soutiens p = aussi bien et le standard q = parce que Yahoo étant le canard impair, il est utilise p =
- Version 2 php est plus complexe et je codage rapide pour certaines des variablesLes noms ont été choisis mal.s'il vous plaît ne pas se plaindre que son code libre.Mais si vous voulez le corriger et documenter et l'ajouter dans le wiki comme la version 3 qui serait fantastique:) payer avant!
- Si vous avez des problèmes avec l'une de ces étapes, poser une question pour plus d'aide, ou les poster dans la section des commentaires ci-dessous.
Commentaires
| Daniel Auteur vedette 69 articles Started 2601 Article Edits 24,290 Points |
Daniel est un auteur vedette avec VisiHow.Daniel a atteint le niveau de "Lieutenant" avec 24,290 points.Daniel a commencé 69 articles et a fait 2,601 article modifications.17,578 personnes ont lu l'article des contributions de Daniel. |
Daniel : | Salut, mon nom est Daniel. |
Daniel : | Puis-je vous aider avec votre problème de "analyser facilement / rechercher les chaînes de requête de recherche d'une page Web à partir de journaux apache utilisant php awk et les utilitaires Linux en ligne de commande sed»? |