2011-04-20 5 views
5

Je suis assez mauvais à l'aide de "basic?" commandes Unix et cette question met encore plus mes connaissances à tester. Ce que je voudrais faire est grep toutes les adresses IP à partir d'un journal (par exemple access.log d'Apache) et compter combien de fois ils se produisent. Puis-je le faire avec une commande ou dois-je écrire un script pour cela?Grepping logs pour les adresses IP

Br, Paul Peelen

+0

Jetez un oeil à ma réponse à StackExchange unix: https://unix.stackexchange.com/a/389565/249079 – Ganapathy

Répondre

13

Vous aurez besoin d'un pipeline court au moins.

sed -e 's/\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/' -e t -e d access.log | sort | uniq -c 

Qui va imprimer chaque adresse IP (ne fonctionnera qu'avec ipv4), trié en préfixe avec le nombre.

Je l'ai testé avec access.log d'apache2 (il est configurable cependant, donc vous devrez vérifier), et cela a fonctionné pour moi. Il suppose que l'adresse IP est la première chose sur chaque ligne.

Le sed recueille les adresses IP (en fait, il recherche 4 séries de chiffres, avec des périodes entre les deux), et remplace la ligne entière avec lui. -e t continue à la ligne suivante s'il a réussi à effectuer une substitution, -e d supprime la ligne (s'il n'y avait pas d'adresse IP dessus). sort trie .. :) Et uniq -c compte les instances de lignes identiques consécutives (ce qui, puisque nous les avons triées, correspond au nombre total).

2

vous pouvez effectuer les opérations suivantes (où datafile est le nom du fichier journal)

egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' datafile | sort | uniq -c 

modifier: a raté la partie sur l'adresse de comptage, maintenant ajouté

+0

Cela échoue, car egrep imprimera toute la ligne, y compris les horodatages, et chaque ligne sera unique, vous devez isoler l'adresse IP et supprimer le reste de la ligne (ou d'une autre manière considérer uniquement l'adresse IP lors de la vérification) – falstro

-1

avec sed:

$ sed 's/.*\(<regex_for_ip_address>\).*/\1/' <filename> | sort | uniq -c 

Vous pouvez chercher et trouver regex disponibles pour adresse ip sur Inernet et le remplacer par <regex_for_ip_address>. par exemple. From answers to a related question on stackoverflow

+0

Cela pourrait en fait échouer, comme le souligne Dave Tarsi, il va attraper des choses comme les versions de navigateur qui sont des adresses IP valides. Vous devez savoir où se trouve l'adresse IP sur la ligne (début) et ne sélectionner que ces lignes. – falstro

0

egrep '[[chiffre:]] {1,3} (. [[: Chiffre:]] {1,3}) {3}' | awk '{imprimer $ 1}' | sort | uniq -c

+1

Cela pourrait effectivement échouer, comme le fait remarquer Dave Tarsi, il va attraper des choses comme les versions de navigateur qui sont des adresses IP valides.Vous devez savoir où se trouve l'adresse IP sur la ligne (début) et ne sélectionner que ces lignes. – falstro

0

Ce qui suit est un script que j'ai écrit il y a plusieurs années. Il greps les adresses des journaux d'accès apache. Je l'ai juste essayé en cours d'exécution Ubuntu 11.10 (oneiric) 3.0.0-32-générique # 51-Ubuntu SMP Thu Mar 21 15:51:26 UTC 2013 i686 i686 i386 GNU/Linux Cela fonctionne très bien. Utilisez Gvim ou Vim pour lire le fichier résultant, qui sera appelé unique_visits, qui listera les ips uniques dans une colonne. La clé de ceci est dans les lignes utilisées avec grep. Ces expressions fonctionnent pour extraire les numéros d'adresse IP. IPV4 seulement. Vous devrez peut-être passer en revue et mettre à jour les numéros de version du navigateur. Un autre scénario similaire que j'ai écrit pour un système Slackware est ici: http://www.perpetualpc.net/srtd_bkmrk.html

#!/bin/sh 
#eliminate search engine referals and zombie hunters. combined_log is the original file 
egrep '(google)|(yahoo)|(mamma)|(query)|(msn)|(ask.com)|(search)|(altavista)|(images.google)|(xb1)|(cmd.exe)|(trexmod)|(robots.txt)|(copernic.com)|(POST)' combined_log > search 
#now sort them to eliminate duplicates and put them in order 
sort -un search > search_sort 
#do the same with original file 
sort -un combined_log > combined_log_sort 
#now get all the ip addresses. only the numbers 
grep -o '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' search_sort > search_sort_ip 
grep -o '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' combined_log_sort > combined_log_sort_ip 
sdiff -s combined_log_sort_ip search_sort_ip > final_result_ip 
#get rid of the extra column 
grep -o '^\|[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' final_result_ip > bookmarked_ip 
#remove stuff like browser versions and system versions 
egrep -v '(4.4.2.0)|(1.6.3.1)|(0.9.2.1)|(4.0.0.42)|(4.1.8.0)|(1.305.2.109)|(1.305.2.12)|(0.0.43.45)|(5.0.0.0)|(1.6.2.0)|(4.4.5.0)|(1.305.2.137)|(4.3.5.0)|(1.2.0.7)|(4.1.5.0)|(5.0.2.6)|(4.4.9.0)|(6.1.0.1)|(4.4.9.0)|(5.0.8.6)|(5.0.2.4)|(4.4.8.0)|(4.4.6.0)' bookmarked_ip > unique_visits 

exit 0 
-1
cat access.log |egrep -o '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' |uniq -c|sort 
Questions connexes