Compter le nombre unique de lignes d’un fichier

Commande uniq linux

Je logue dans syslog toutes les erreurs de Varnish afin d’avoir un enregistrement qui correspond à ça :

Jul 19 14:05:31 cfvarnish01 varnishd[29759]: backend_error on server13 => Time: Tue, 19 Jul 2016 12:05:31 GMT => IP: XX.XX.XX.XX, XX.XX.XX.XX - PUT mywebsite.fr/xxxx?v=2 - X-Served-By : varnish01 - X-Pass-D : POST request - Hash - Pass

Je voulais au moment du logrorate avec des stats sur le nombre d’erreur généré par jour. La commande wc -l  me permet de compter le nombre de lignes présent dans le fichier. Ainsi avec la commande suivante j’ai pu obtenir mon résultat.

grep backend /var/log/syslog | wc -l

J’ai voulu aller plus loin en obtenant le nombre d’erreur par heure. La commande uniq -w9 -c  a répondu à mes attentes. Je l’ai couplé avec un awk afin d’afficher un résultat plus parlant. Voici la commande finale, qui peut paraître un peu barbare, je n’ai pas réussi à faire plus simple, et je n’avais pas vraiment le temps d’y perdre plus de temps.

grep backend /var/log/syslog | uniq -w9 -c | awk '{print $1 " errors the " $2 " " $3 " at " $4}' | awk -F':' '{print $1 "h"}'

Le résultat est le suivant :

2 errors the Jul 19 at 14h

La commande uniq -w9 -c  va comparer les 9 premiers caractères de chaque lignes, pour ensuite afficher le nombre d’occurrences et n’afficher ensuite qu’une seule des lignes identiques.