web-dev-qa-db-fra.com

Trier et compter le nombre d'occurrences de lignes

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 
169
Kokizzu
| 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:

233
visudo
[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

131
Eduard Florinescu

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
12