J'ai Apache
fichier journal, access.log
, comment compter le nombre d'occurrences de ligne dans ce fichier? par exemple le résultat de cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'
est
a.php
b.php
a.php
c.php
d.php
b.php
a.php
le résultat que je veux est:
3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php
| sort | uniq -c
Comme indiqué dans les commentaires.
Le fait de canaliser la sortie dans sort
organise la sortie dans l'ordre alphabétique/numérique.
Ceci est une exigence car uniq
ne correspond que sur des lignes répétées, c'est-à-dire
a
b
a
Si vous utilisez uniq
sur ce fichier texte, il renverra ce qui suit:
a
b
a
En effet, les deux a
sont séparés par le b
- ce ne sont pas des lignes consécutives. Cependant, si vous triez d'abord les données dans l'ordre alphabétique, comme
a
a
b
Ensuite, uniq
supprimera les lignes répétitives. L'option -c
De uniq
compte le nombre de doublons et fournit une sortie sous la forme:
2 a
1 b
Références:
[your command] | sort | uniq -c | sort -nr
La réponse acceptée est presque complète, vous voudrez peut-être ajouter un sort -nr
Supplémentaire à la fin pour trier les résultats avec les lignes qui se produisent le plus souvent en premier
Options uniq :
-c, --count
prefix lines by the number of occurrences
options de tri :
-n, --numeric-sort
compare according to string numerical value
-r, --reverse
reverse the result of comparisons
Dans le cas particulier où les lignes que vous triez sont des nombres, vous devez utiliser sort -gr
Au lieu de sort -nr
, Voir commentaire
Vous pouvez utiliser un tableau associatif sur awk puis -optional- sort:
$ awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' access.log | sort
production:
1 c.php
1 d.php
2 b.php
3 a.php