Bash - Compteur de visites avec les logs
Ce script Bash analyse les fichiers access logs Nginx pour obtenir des statistiques de fréquentation mensuelles sur une année donnée.
Il distingue les visites humaines des bots et compte le nombre d’adresses IP uniques par mois et par type de visite.
Le script est RGPD-friendly, aucune IP n’est stockée ou utilisée en dehors du comptage temporaire. Les fichiers statiques (CSS, JS, images, polices) sont ignorés afin que le comptage humain reflète des visites réelles sur les pages. Il fonctionne avec awk standard sur Debian, sans dépendances supplémentaires. Les statistiques sont affichées sous forme de tableau lisible avec séparateurs par mois.
Affichage final :
------------------------------- |
Script
Ce script :
- Lit tous les logs Nginx de l’année
- Détecte bots VS humains via User-Agent et URL
- Compte IP uniques par mois et par type
- Affiche un tableau avec séparateurs
- Ignore les fichiers statiques pour éviter d’augmenter la stat “humains”
- RGPD-friendly : pas de stockage d’IP en base, juste comptage temporaire
|
Explication détaillée
Shebang
Indique que le script doit être exécuté avec bash :
Variables
Liste de mots-clés pour détecter les bots et les scanners dans le User-Agent. Le | signifie “ou” dans la regex.
HUMAN_BOTS='bot|crawl|spider|slurp|bingpreview|yandex|duckduckbot|baiduspider|curl|wget|python|go-http|java|httpclient|scanner|monitor' |
Regex pour ignorer les requêtes sur les fichiers statiques (CSS, JS, images, polices). Utile pour ne compter que les vraies visites humaines (pas chaque image ou script).
STATIC_EXT='.((css|js|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|map))$' |
Année à analyser pour filtrer uniquement les logs de cette année precise.
YEAR='2026' |
Main program
Traitement des variables
Lance la commande awk. L’option -v var=value permet de passer les variables year, bots et static dans awk .
awk -v year="$YEAR" -v bots="$HUMAN_BOTS" -v static="$STATIC_EXT" ' |
Affichage du header du tableau
La section BEGIN s’exécute avant de lire les logs. Elle affiche le header du tableau avec une ligne de séparation. Les %-10s et %-6s sont des formatages pour aligner les colonnes.
BEGIN { |
Traitement et mise en forme des données des logs
Cette partie fait le traitement sur le fichier de logs Ngnix.
$4: champ de la date dans le log Nginx ([09/Jan/2026:12:34:56 +0000]).split($4, d, "/"): découpe la date en tableau d par /.d[2]: mois (Jan)d[3]: année + heure (2026:12:34:56)substr(d[3],1,4): extrait uniquement l’année.
{ |
Cette partie récupère les information du fichier de logs Ngnix et les traite.
$1: l’IP du visiteur$7 →: la page demandée (URL)tolower($0) : met la ligne en minuscule pour simplifier la détection de bots
if (year_log != year) next |
Prépare une clé “mois/année” pour le regroupement, ex: Jan/2026.
key_month = month "/" year |
Détermine le type de visite :
- Si User-Agent correspond à la liste bots : bot
- Sinon, si l’URL n’est pas un fichier statique : human
- Sinon : ignore la ligne (next)
if (ua ~ bots) { |
Crée une clé unique par mois, type et IP. En mettant visits[key] = 1, une IP est comptée une seule fois par mois/type.
key = key_month "|" type "|" ip |
La section END, après avoir parcouru tous les logs permet pour chaque IP unique, d’incrémenter un compteur par mois et type (count[mois|type]).
END { |
Affichage des données
Cette partie mets en place l’affichage du résultat. La commande asorti(count, sorted) trie les clés du tableau count par ordre alphabétique
La boucle for permet d’afficher les données triées sépare par mois (prev_month) et ajoute une ligne de séparation
n = asorti(count, sorted) |
Choix du fichier à traiter
Fichier log Nginx à analyser.
' /var/log/nginx/access.log |
Documentation
Man