web-dev-qa-db-fra.com

Trier l'adresse IP uniq à partir du journal Apache

J'essaie d'extraire les adresses IP de mon journal Apache, de les compter et de les trier.

Et pour une raison quelconque, le tri est horrible.

Voici la commande:

cat access.* | awk '{ print $1 }' | sort | uniq -c | sort -n

Exemple de sortie:

  16789 65.X.X.X
  19448 65.X.X.X
   1995 138.X.X.X
   2407 213.X.X.X
   2728 213.X.X.X
   5478 188.X.X.X
   6496 176.X.X.X
  11332 130.X.X.X

Je ne comprends pas pourquoi ces valeurs ne sont pas vraiment triées. J'ai également essayé de supprimer les espaces en début de ligne (sed 's/^[\t ]*//g') et d'utiliser sort -n -t" " -k1, ce qui ne change rien.

Un indice?

32
Arthur

Cela peut être tardif, mais utiliser le numérique dans le premier tri vous donnera le résultat souhaité.

cat access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20

Sortie: 

 29877 93.xxx.xxx.xxx
  17538 80.xxx.xxx.xxx
   5895 198.xxx.xxx.xxx
   3042 37.xxx.xxx.xxx
   2956 208.xxx.xxx.xxx
   2613 94.xxx.xxx.xxx
   2572 89.xxx.xxx.xxx
   2268 94.xxx.xxx.xxx
   1896 89.xxx.xxx.xxx
   1584 46.xxx.xxx.xxx
   1402 208.xxx.xxx.xxx
   1273 93.xxx.xxx.xxx
   1054 208.xxx.xxx.xxx
    860 162.xxx.xxx.xxx
    830 208.xxx.xxx.xxx
    606 162.xxx.xxx.xxx
    545 94.xxx.xxx.xxx
    480 37.xxx.xxx.xxx
    446 162.xxx.xxx.xxx
    398 162.xxx.xxx.xxx
84
linsort

Pourquoi utiliser cat | awk? Il vous suffit d'utiliser awk:

awk '{ print $1 }' /var/log/*access*log | sort -n | uniq -c | sort -nr | head -20
15
Benjamin Dupuis

Je ne sais pas pourquoi un simple sort -n n'a pas fonctionné, mais l'ajout d'un caractère non numérique entre le compteur et l'adresse IP a bien plu à mon problème.

cat access.* | awk '{ print $1 } ' | sort | uniq -c | sed -r 's/^[ \t]*([0-9]+) (.*)$/\1 --- \2/' | sort -rn
4
Arthur

Cela devrait marcher

cat access.* | awk '{ print $1 }' | sort | awk '{print $1 " " $2;}' | sort -n

Je ne vois pas de problème.

Caractères de contrôle dans les fichiers?

Système de fichiers plein (fichiers temporaires)?

2
tue

Si le tri n'aboutit pas comme prévu, cela est probablement dû à un problème de paramètres régionaux.

| LC_ALL=C sort -rn

awk '{array[$1]++}END{ for (ip in array) print array[ip] " " ip}' <path/to/Apache/*.log> | LC_ALL=C sort -rn

Sources ne trie pas comme prévu (espace et paramètres régionaux)

http://www.commandlinefu.com/commands/view/9744/sort-ip-by-count-quickly-with-awk-from-Apache-logs

0
Antony Gibbs