J'ai Apache
logfile, access.log
comment compter le nombre d'occurrence de ligne dans ce fichier? par exemple le résultat de cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'
is
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
command-line
sort
Kokizzu
la source
la source
| sort | uniq -c
| LC_ALL=C sort | LC_ALL=C uniq -c
uniq
pourrait faire ça ..Réponses:
Comme indiqué dans les commentaires.
Piping the output en
sort
organise la sortie en ordre alphabétique / numérique.Ceci est une exigence car les
uniq
correspondances uniquement sur des lignes répétées, c'est-à-direSi vous utilisez
uniq
sur ce fichier texte, il retournera ce qui suit:C'est parce que les deux
a
s sont séparés par leb
- ils ne sont pas des lignes consécutives. Cependant, si vous triez d'abord les données dans l'ordre alphabétique, commePuis
uniq
supprimera les lignes répétitives. L'-c
option deuniq
compte le nombre de doublons et fournit une sortie sous la forme:Références:
sort(1)
uniq(1)
la source
printf '%s\n' ①.php ②.php | sort | uniq -c
me donne2 ①.php
php\nphp
①.php
les mêmes que②.php
dans mes paramètres régionaux, car aucun ordre de tri n'est défini pour ceux-ci①
et le②
caractère dans mes paramètres régionaux. Si vous voulez uniques valeurs pour toutes les valeurs d'octet (souvenez - vous des chemins de fichiers ne sont pas nécessairement du texte), alors vous devez corriger les paramètres régionaux C:| LC_ALL=C sort | LC_ALL=C uniq -c
.La réponse acceptée est presque terminée, vous pouvez ajouter un petit plus
sort -nr
à la fin pour trier les résultats avec les lignes qui apparaissent le plus souvent en premier.options uniq :
options de tri :
Dans le cas particulier où les lignes que vous triez sont des nombres, vous devez les utiliser
sort -gr
au lieu desort -nr
, voir le commentairela source
-n
option.tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt
. La première commande remplace les espaces par des nouvelles lignes, permettant ainsi au reste de la commande de fonctionner comme prévu.sort -gr
place résout ce problème.-g
: compare en fonction de la valeur numérique générale (au lieu de-n
: compare en fonction de la valeur numérique de la chaîne).-gr
mais je pense que le résultat deuniq -c
sera telsort -nr
-gr
fonctionne mieux. Essayez ces deux exemples, ne différant que par les drapeaux g et n:echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nr
etecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr
. Le premier trie de manière incorrecte, mais pas le second.Vous pouvez utiliser un tableau associatif sur awk puis, éventuellement, trier :
sortie:
la source