Bien que les outils ci-dessus soient tous cool, je pense que je sais ce que l'interrogateur demandait. Cela me fait souvent mal de ne pas pouvoir extraire les informations d'un journal d'accès de la manière que je peux avec d'autres fichiers.
C'est à cause du format de journal d'accès stupide:
127.0.0.1 - - [16/Aug/2014:20:47:29 +0100] "GET /manual/elisp/index.html HTTP/1.1" 200 37230 "http://testlocalhost/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0"
Pourquoi ont-ils utilisé [] pour la date et "" pour d'autres choses? pensaient-ils que nous ne saurions pas qu'une date était dans le champ 4? C'est incroyablement frustrant.
Le meilleur outil en ce moment est gawk:
gawk 'BEGIN { FPAT="([^ ]+)|(\"[^\"]+\")|(\\[[^\\]]+\\])" } { print $5 }'
sur les données ci-dessus, cela vous donnerait:
"GET /manual/elisp/index.html HTTP/1.1"
En d'autres termes, le FPAT vous donne la possibilité d'extraire les champs de l'apache-log comme s'il s'agissait de champs réels au lieu de simplement des entités séparées par des espaces. C'est toujours ce que je veux. Je peux ensuite analyser cela un peu plus avec un pipeline.
Le fonctionnement du FSPAT est défini ici: http://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html
Vous pouvez donc configurer un alias pour créer un gawk capable d'analyser les journaux apache:
alias apacheawk="gawk -vFPAT='([^ ]+)|(\"[^\"]+\")|(\\\\[[^\\\\]]+\\\\])' "
apacheawk '$6 ~ /200/ { print $5 } | sort | uniq
fait ceci pour moi:
"GET / HTTP/1.1"
"GET /manual/elisp/index.html HTTP/1.1"
"GET /manual/elisp/Index.html HTTP/1.1"
"GET /scripts/app.js HTTP/1.1"
"GET /style.css HTTP/1.1"
et bien sûr presque tout le reste est désormais possible.
Prendre plaisir!