J'ai un fichier au format suivant:
$ cat file.txt
27.33.65.2
27.33.65.2
58.161.137.7
121.50.198.5
184.173.187.1
184.173.187.1
184.173.187.1
Quelle est la meilleure façon d'analyser le fichier file.txt
dans un format comme:
27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3
En d'autres termes, je veux parcourir le fichier et compter le nombre de fois que chaque adresse IP apparaît. Je l'ai déjà parcouru, sort
donc toutes les adresses IP sont en ordre et directement les unes après les autres.
Réponses:
Vous cherchez
uniq -c
Si le résultat n'est pas à votre goût, il peut être analysé et reformaté facilement.
Par exemple:
la source
uniq
etawk
ne semble pas être une excellente approche pour moi ...uniq
que ne fonctionne que sur les entrées triées (il correspond aux lignes correspondantes adjacentes, pas aux lignes du fichier).sort
!uniq
semble être la solution la plus intelligente, en effet. La manière awk:la source
sort
à ma réponse est encore plus rapide car moins d'articles doivent être triés. ;-)le fichier de tri firest obtient alors le compte par unic -c
sort filename | uniq -c
la source
uniq -c
fonctionnerait mais fournirait la sortie au mauvais format. C'est pourquoi la réponse acceptée n'utilise passort
et reformate à la place la sortie deuniq -c
.J'utiliserais python. Chaque ststem linux a de nos jours installé python2.
Ajoutez chaque adresse IP dans un dict (tableau associatif) sous forme de paires clé = valeur, c'est-à-dire {"12.34.56.78": 1, "87.76.43.21": 3}.
Vous "vérifiez" l'adresse IP en tant que clé et incrémentez la valeur de 1. Si vous utilisez defaultdict ("ip"), si la clé n'existe pas, elle est créée avec une valeur par défaut de 0. Si la clé existe déjà, defaultdict ne fait rien. La valeur est incrémentée sur la ligne suivante.
fichier outout:
Je sais que vous cherchiez une solution de ligne de commande, mais comme vous pouvez le voir, c'est un affichage au format élégant qui ne prenait qu'une douzaine de lignes environ. Python est un excellent outil d'administration.
la source