Création d'un rapport simple
Pour notre tâche finale, créons un rapport HTML simple résumant certaines informations clés de notre fichier journal. Nous utiliserons un script AWK stocké dans un fichier séparé pour cette opération plus complexe.
Cette étape combine plusieurs idées AWK vues dans les sections précédentes :
- des compteurs tels que
total++
- des tableaux tels que
ip_count[$3]++
- un bloc
END qui imprime le résumé final
Si le script semble long au premier abord, concentrez-vous sur un bloc à la fois. Vous n'avez pas besoin de mémoriser tout le fichier avant de l'exécuter.
Tout d'abord, créez un fichier nommé log_report.awk avec le contenu suivant :
Astuces : Copiez le contenu ci-dessous et collez-le dans votre terminal pour créer le fichier.
cat << 'EOF' > log_report.awk
BEGIN {
print "<html><body>"
print "<h1>Server Log Summary</h1>"
total = 0
errors = 0
}
{
total++
if ($6 >= 400) errors++
ip_count[$3]++
resource_count[$5]++
}
END {
print "<p>Total requests: " total "</p>"
print "<p>Error rate: " (errors/total) * 100 "%</p>"
print "<h2>Top 5 IP Addresses</h2>"
print "<ul>"
for (ip in ip_count) {
top_ips[ip] = ip_count[ip]
}
n = asort(top_ips, sorted_ips, "@val_num_desc")
for (i = 1; i <= 5 && i <= n; i++) {
for (ip in ip_count) {
if (ip_count[ip] == sorted_ips[i]) {
print "<li>" ip ": " ip_count[ip] " requests</li>"
break
}
}
}
print "</ul>"
print "<h2>Top 5 Requested Resources</h2>"
print "<ul>"
for (resource in resource_count) {
top_resources[resource] = resource_count[resource]
}
n = asort(top_resources, sorted_resources, "@val_num_desc")
for (i = 1; i <= 5 && i <= n; i++) {
for (resource in resource_count) {
if (resource_count[resource] == sorted_resources[i]) {
print "<li>" resource ": " resource_count[resource] " requests</li>"
break
}
}
}
print "</ul>"
print "</body></html>"
}
EOF
Comprenons ce script AWK section par section :
-
Bloc BEGIN : S'exécute avant de traiter toute ligne d'entrée
BEGIN {
print "<html><body>" ## Début de la structure HTML
print "<h1>Server Log Summary</h1>"
total = 0 ## Initialiser le compteur pour le total des requêtes
errors = 0 ## Initialiser le compteur pour les requêtes en erreur
}
-
Bloc de traitement principal : S'exécute pour chaque ligne du fichier d'entrée
{
total++ ## Incrémenter le compteur total de requêtes
if ($6 >= 400) errors++ ## Compter les réponses d'erreur (codes d'état >= 400)
ip_count[$3]++ ## Compter les requêtes par adresse IP (champ 3)
resource_count[$5]++ ## Compter les requêtes par ressource (champ 5)
}
-
Bloc END : S'exécute après le traitement de toutes les lignes d'entrée
END {
## Imprimer les statistiques de résumé
print "<p>Total requests: " total "</p>"
print "<p>Error rate: " (errors/total) * 100 "%</p>"
## Traiter et imprimer les 5 meilleures adresses IP
## ...
## Traiter et imprimer les 5 meilleures ressources demandées
## ...
print "</body></html>" ## Fin de la structure HTML
}
Avant de continuer, notez le flux global :
BEGIN imprime les balises HTML d'ouverture et initialise les compteurs.
- Le bloc central traite chaque ligne de journal et met à jour les totaux.
END imprime le rapport final après que chaque ligne a été analysée.
Examinons la logique de tri pour les meilleures IP (la section des ressources fonctionne de la même manière) :
## Copier les comptes dans un nouveau tableau pour le tri
for (ip in ip_count) {
top_ips[ip] = ip_count[ip]
}
## Trier le tableau par valeur dans l'ordre décroissant
n = asort(top_ips, sorted_ips, "@val_num_desc")
## Imprimer les 5 meilleures entrées
for (i = 1; i <= 5 && i <= n; i++) {
## Trouver l'IP originale qui correspond à ce compte
for (ip in ip_count) {
if (ip_count[ip] == sorted_ips[i]) {
print "<li>" ip ": " ip_count[ip] " requests</li>"
break
}
}
}
Dans ce script :
- La fonction
asort() trie le tableau
"@val_num_desc" est un argument spécial qui lui indique de trier numériquement par valeur dans l'ordre décroissant
- Les boucles imbriquées trouvent et impriment les 5 meilleures entrées
Vous pouvez concevoir les boucles imbriquées comme ceci :
- la première boucle décide quels comptes appartiennent au top 5
- la seconde boucle trouve quelle adresse IP ou ressource a produit chaque compte
Ce modèle de recherche est plus avancé que les étapes précédentes, il est donc normal si c'est la première partie du laboratoire qui ressemble à de la vraie programmation plutôt qu'à une commande d'une ligne.
Maintenant, exécutons notre script AWK pour générer le rapport :
awk -f log_report.awk server_logs.txt > log_report.html
L'option -f indique à AWK de lire le script à partir du fichier spécifié :
-f log_report.awk - Lit le script AWK à partir du fichier log_report.awk
server_logs.txt - Traite ce fichier en utilisant le script
> log_report.html - Redirige la sortie vers le fichier log_report.html
Vous pouvez visualiser le contenu du rapport en utilisant la commande cat :
cat log_report.html
Si la sortie HTML semble difficile à parcourir dans le terminal, prévisualisez d'abord seulement la première partie :
head -n 15 log_report.html
Ce rapport fournit un résumé du total des requêtes, du taux d'erreur, des 5 meilleures adresses IP et des 5 meilleures ressources demandées. Dans un scénario réel, vous pourriez ouvrir ce fichier HTML dans un navigateur web pour une vue formatée.
L'approche que nous avons utilisée dans ce script démontre comment AWK peut être utilisé pour des tâches d'analyse de données plus complexes. Vous pouvez étendre ce script pour inclure des statistiques supplémentaires ou différentes visualisations en fonction de vos besoins spécifiques.