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?
la source
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?
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.log
trouve le fichier que vous souhaitez inspecter et Windows|Linux
une 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
.