Situation:
J'ai un gros fichier (des millions de lignes) contenant les adresses IP et les ports d'une capture réseau de plusieurs heures, un ip / port par ligne. Les lignes sont de ce format:
ip.ad.dre.ss[:port]
Résultat désiré:
Il y a une entrée pour chaque paquet que j'ai reçu lors de la journalisation, donc il y a beaucoup d'adresses en double. J'aimerais pouvoir l'exécuter via un script shell quelconque qui pourra le réduire en lignes du format
ip.ad.dre.ss[:port] count
où count
est le nombre d'occurrences de cette adresse (et port) spécifique. Aucun travail particulier ne doit être effectué, traitez les différents ports comme des adresses différentes.
Jusqu'à présent, j'utilise cette commande pour extraire toutes les adresses IP du fichier journal:
grep -o -E [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt
À partir de là, je peux utiliser une expression régulière assez simple pour extraire toutes les adresses IP qui ont été envoyées par mon adresse (dont je ne me soucie pas)
Je peux ensuite utiliser ce qui suit pour extraire les entrées uniques:
sort -u ips.txt > intermediate.txt
Je ne sais pas comment je peux agréger les nombres de lignes avec tri.
-bgr
ressemble par hasard à un mnémonique pourbigger
, c'est ce que nous voulons au sommet..bashrc
ou.bash_aliases
fichier:function countuniquelines () { sort "$1" | uniq -c | sort -bgr; }
. Appelezcountuniquelines myfile.txt
.sort -nr
.Pour compter le nombre total de lignes uniques (c'est-à-dire sans considérer les lignes en double), nous pouvons utiliser
uniq
ou Awk avecwc
:Les tableaux d'Awk sont associatifs et peuvent donc s'exécuter un peu plus vite que le tri.
Générer un fichier texte:
la source
C'est le moyen le plus rapide d'obtenir le décompte des lignes répétées et de les faire imprimer joliment, du moins fréquent au plus fréquent:
Si vous ne vous souciez pas des performances et que vous voulez quelque chose de plus facile à retenir, exécutez simplement:
PS:
sort -n analyse le champ comme un nombre, c'est correct puisque nous trions en utilisant les nombres.
la source
!
in{!seen[$0]++}
est redondant ici, car nous ne faisons que l'impression au niveau duEND
.