Comment imprimer des statistiques à partir de lignes dans un fichier

0

Je me retrouve souvent à calculer manuellement les pourcentages après avoir filtré dans un fichier journal pour trouver la proportion de X ou de Y qu'il contient. Cela peut-il être facilement réalisé via des outils CLI courants?

Seldaek
la source

Réponses:

3

En règle générale, je vais identifier quelques caractéristiques dans un fichier journal que je souhaite distinguer et obtenir des pourcentages. Cela peut être fait facilement avec sed, en remplaçant tout ce dont vous n’avez pas besoin dans chaque ligne, puis en comptant le nombre de fois. Par exemple, pour distinguer les hits Linux et Windows dans un fichier journal, vous pouvez faire:

$ cat some.log | sed -r 's/.*(Windows|Linux).*/\1/' | sort | uniq -c | sort -rn
23940 Windows
12390 Linux

Cela vous donne le nombre absolu pour chaque trait que vous recherchez, mais pas le pourcentage donc ce n'est pas encore idéal.

Il semble qu'awk ne puisse pas facilement parcourir deux fois les lignes pour calculer d'abord le total, puis les pourcentages de sortie, mais avec un petit hack, nous pouvons d'abord ajouter une ligne en haut qui montre la somme de tous les traits correspondants:

$ ... | awk '{s+=$1;lines=lines"\n"$0} END {printf "%d Total",s;print lines}' 
Total 36330
Windows 23940
Linux 12390

Enfin, maintenant que nous avons le total, nous pouvons facilement calculer et imprimer des pourcentages en utilisant ceci:

$ ... | awk '!max{max=$1}{s=$1/max*100;c=$1;$1="";printf "%30s %10d %7.2f%%\n",$0,c,s;}'
Total     36330   100.00%
Windows   23940    65.90%
Linux     12390    34.10%

Le one-liner combiné serait alors:

cat some.log | sed -r 's/.*(Windows|Linux).*/\1/' | sort | uniq -c | sort -rn | awk '{s+=$1;lines=lines"\n"$0} END {printf "%d Total",s;print lines}' | awk '!max{max=$1}{s=$1/max*100;c=$1;$1="";printf "%30s %10d %7.2f%%\n",$0,c,s;}'

Où se some.logtrouve le fichier que vous souhaitez inspecter et Windows|Linuxune liste de termes délimités par des tuyaux à comparer / distinguer.

Si vous souhaitez supprimer la ligne Total à la fin, car elle devient légèrement inutile, vous pouvez l'ajouter | tail -n +2.

Seldaek
la source