14Aug

Facilement analyser / rechercher les chaînes de requête de recherche d'une page de web à partir de logs apache utilisant php awk et les utilitaires de ligne de commande linux sed

6 Pièces: Utilisez awk et sed pour analyser les fichiers journaux apache pour dactylographié utilisateur requêtes de recherche Problèmes connus Version 2: Moins de prétraitement ligne de commande et un traitement plus php ToDo Conseils Astuces & amp;Avertissements Commentaires

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.

Était-ce utile?Oui |Non |Je besoin d'aide
Contenu
  • 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
Ad

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

Était-ce utile?Oui |Non |Je besoin d'aide

== 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."

Était-ce utile?Oui |Non |Je besoin d'aide

$ 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;

Était-ce utile?Oui |Non |Je besoin d'aide

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?;

Était-ce utile?Oui |Non |Je besoin d'aide

& 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.

Était-ce utile?Oui |Non |Je besoin d'aide

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;

Était-ce utile?Oui |Non |Je besoin d'aide fonction

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 title2

EOF;

était-ce utile? Oui | Non | je besoin d'aide
?

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?;

Était-ce utile?Oui |Non |Je besoin d'aide

& 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

VisiHow accueille tous les commentaires .Si vous ne voulez pas être anonyme, inscrivez-vous ou connectez-vous. Il est gratuit.




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.
Demandez 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»?
Accepter