Apprenez en lisant dans l'ordre

Rapport d'agrégation de logs — arguments, fonctions et commandes combinées

Cet article fait partie du Cours Linux, qui vous permet de maîtriser à partir de zéro des compétences Linux concrètes, des commandes de base jusqu'aux scripts shell.
Prends le log cible avec log=${1:-access.log}, agrège-le avec une boucle for plus grep -c et awk '{sum+=$1}', et réunis le tout dans un rapport here-doc et un code de sortie — illustré et pratiqué dans un terminal en navigateur.

Réunir les pièces dans un seul script — le squelette d'un rapport d'agrégation de logs

Tout ce que tu as appris jusqu'ici — variables, paramètres positionnels ($1), conditions ([ ] et if), boucles (for / while), fonctions (name() { } et local), lecture d'entrée (while read … done < file), intégration de commandes ($(...)) et sortie (>> et here-doc) — se réunit maintenant dans un seul vrai script.

Le sujet retenu est le cas le plus courant en exploitation : un rapport d'agrégation de logs.

Un script réaliste prend le log cible et un seuil comme arguments, vérifie que le fichier est bien là, agrège, réunit les résultats dans un rapport et termine en renvoyant un code de sortie.

Pour l'agrégation, combine des commandes comme grep pour les comptages, awk pour les sommes et sed pour la mise en forme ; regrouper le travail répété dans des fonctions et des boucles garde le script lisible.

Quand un paramètre positionnel est vide, complète-le avec la valeur par défaut ${1:-access.log}.

vi mini.sh   # ouvre le fichier dans un éditeur, écris ceci, puis enregistre avec :wq
#   #!/bin/sh
#   log=${1:-access.log}              # valeur par défaut si aucun argument
#   count_status() {                  # fonction renvoyant le nombre pour un code de statut
#     grep -c " $1\$" "$log"
#   }
#   if [ ! -f "$log" ]; then          # contrôle du fichier
#     echo "not found: $log" >&2
#     exit 1
#   fi
#   for s in 200 403 500; do          # agréger par code de statut
#     echo "$s : $(count_status $s)"
#   done
#   exit 0
chmod +x mini.sh
Le déroulement d'un script réaliste
arguments reçus$1 log / $2 limitvérifier le fichier[ -f "$log" ]fonction d'agrégationgrep + awk combinéslire avec while readligne par lignehere-docsortie du rapportexit 0 / 1renvoyer le résultat① Préparer② Agréger③ Restituer
Construis-le dans cet ordre : prendre les arguments → vérifier le fichier → agréger (en combinant les commandes) → écrire le rapport → renvoyer le code de sortie.
ÉlémentSon rôle dans ce scriptExemple
Variable name=...Garder le nom du log, la destination et le seuil au même endroitlog=${1:-access.log}
Argument $1 / ${1:-défaut}Prendre le log cible et le seuil sur la ligne de commandelimit=${2:-1}
Condition [ -f f ] / ifVérifier que le log existe et déterminer si le seuil est dépasséif [ ! -f "$log" ]; then exit 1; fi
Boucle for / while readAgréger par code de statut et lire une ligne à la foisfor s in 200 403 500; do … done
Fonction name() { … }Regrouper l'agrégation sous un nom et la réutilisercount_status() { grep -c " $1\$" "$log"; }
Lecture d'entrée while read … < fLire le log ligne par ligne et compter par URLwhile read line; do … done < "$log"
Intégration $(grep -c …) / awkRécupérer comptages et sommes par substitution de commanden=$(grep -c ' 500$' "$log")
Sortie >> / here-docÉcrire les valeurs agrégées dans un rapport à format fixecat > "$out" <<REPORT … REPORT

Construis et lance un script d'agrégation qui réunit arguments, conditions, fonctions, boucles et intégration de commandes.

① Crée le log d'exemple avec printf '12 GET /home 200\n34 GET /login 200\n5 GET /admin 403\n88 GET /api 500\n7 GET /home 200\n21 POST /api 500\n' > access.log.

② Ouvre summary.sh avec vi summary.sh et appuie sur i pour passer en mode insertion. Écris le traitement d'agrégation qui réunit arguments, conditions, fonctions, boucles et intégration de commandes, puis enregistre avec Esc:wq (tu peux copier le contenu depuis le panneau de réponse et le coller).

③ Rends le script exécutable avec chmod +x summary.sh.

④ Lance-le avec ./summary.sh et regarde l'agrégation par code de statut affichée à l'écran. (Exécute-le correctement et l'explication apparaîtra.)

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

Lire l'entrée et finir avec l'intégration de commandes — while read combiné à grep / awk / sed

Fais le travail fin, ligne par ligne, avec while read line; do … done < file.

Combine cela dans une fonction avec grep pour filtrer chaque ligne, awk pour agréger les colonnes et sed pour uniformiser la formulation : tu peux alors réutiliser la logique d'agrégation comme un composant.

Glisse une mise en forme comme sed 's/^GET /[GET] /' : la présentation du rapport reste alors homogène.

Pour finir, intègre les valeurs agrégées dans un rapport fixe avec un here-doc, ajoute un avertissement et renvoie exit 1 quand le seuil est dépassé, ou renvoie exit 0 quand tout va bien.

Prends le second argument comme seuil avec ${2:-100} et compare les nombres comme dans if [ "$err" -gt "$limit" ], et tu obtiens un rapport avec un verdict utilisable en exploitation.

L'aboutissement, c'est de combiner les `grep` / `awk` / `sed` vus dans les bases avec les structures de contrôle d'un script shell.

vi scan.sh   # ouvre le fichier dans un éditeur, écris ceci, puis enregistre avec :wq
#   #!/bin/sh
#   log=${1:-access.log}
#   limit=${2:-1}
#   err=$(grep -c ' 500$' "$log")     # obtenir le nombre de 500 par intégration
#   while read line; do                # lire une ligne à la fois
#     echo "$line" | sed 's/^/log: /'  # mettre en forme et afficher
#   done < "$log"
#   if [ "$err" -gt "$limit" ]; then   # comparer au seuil
#     echo "WARN: too many 500"; exit 1
#   fi
#   exit 0
chmod +x scan.sh
Lire l'entrée en combinant grep / awk / sed
while read line< access.loglire une ligneà la foisgrep / awk / sedfiltrer, agrégeret mettre en formehere-doc +if seuil dépassérapport +exit 0 / 1① Lire ligne par ligne② Agréger③ Juger et sortir
while read prend les lignes une à une, et la combinaison de grep / awk / sed les transforme en un rapport porteur d'un verdict.

Prends l'entrée et un seuil, et termine par un rapport porteur d'un verdict, en combinant while read et grep / awk / sed.

① Crée le log d'exemple avec printf '12 GET /home 200\n34 GET /login 200\n5 GET /admin 403\n88 GET /api 500\n7 GET /home 200\n21 POST /api 500\n' > access.log.

② Ouvre audit.sh avec vi audit.sh et appuie sur i pour passer en mode insertion. Écris le traitement de rapport qui associe while read à grep / awk / sed et ajoute un verdict, puis enregistre avec Esc:wq (tu peux copier le contenu depuis le panneau de réponse et le coller).

③ Rends le script exécutable avec chmod +x audit.sh.

④ Lance-le avec des arguments, comme dans ./audit.sh access.log 1, et vérifie le report.txt généré ainsi que le verdict à l'écran.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

Réussir ou échouer sur un seuil passé en argument — agrégation et codes de sortie combinés

Réunis dans un seul script la prise d'arguments et l'agrégation du début avec le verdict et le code de sortie de la fin : tu obtiens un rapport avec un verdict réussite/échec utilisable en exploitation.

Prends le seuil dans le premier argument ; quand le nombre agrégé par grep -c ou awk l'atteint ou le dépasse, avertis et renvoie exit 1, et quand il reste en dessous, traite-le comme normal et renvoie exit 0.

L'appelant peut déterminer la réussite ou l'échec à partir de ce code de sortie.

Dans une comparaison numérique, -gt signifie « strictement supérieur » et -ge « supérieur ou égal », ce qui change le traitement d'une valeur exactement égale au seuil.

Le [ "$err" -gt "$limit" ] de la pratique 2 n'est pas satisfait quand le comptage égale le seuil, tandis que le [ "$err" -ge "$limit" ] de la pratique 3 avertit même sur une valeur égale.

C'est ce qui décide du verdict à la frontière, donc choisis celui qui correspond à ton besoin.

Réussir ou échouer sur un seuil
err=$(grep -c ' 500$')err ≥ limitWARN + exit 1err < limitOK + exit 0au seuil ou au-dessusen dessousavertissementnormal
-ge compare le comptage agrégé au seuil : à partir du seuil il avertit et renvoie exit 1, en dessous c'est normal et il renvoie exit 0.

Construis et lance un script de rapport avec verdict qui fait réussir ou échouer le résultat agrégé sur un seuil que tu passes en argument.

① Crée le log d'exemple avec printf '12 GET /home 200\n34 GET /login 200\n5 GET /admin 403\n88 GET /api 500\n7 GET /home 200\n21 POST /api 500\n' > access.log.

② Ouvre report.sh avec vi report.sh et appuie sur i pour passer en mode insertion. Écris le traitement de rapport qui décide du verdict sur le seuil, puis enregistre avec Esc:wq (tu peux copier le contenu depuis le panneau de réponse et le coller).

③ Rends le script exécutable avec chmod +x report.sh.

④ Lance-le en passant le seuil comme premier argument, comme dans ./report.sh 2, et vérifie le verdict à l'écran ainsi que le report.txt généré.

⑤ Relance-le avec un nombre différent, comme dans ./report.sh 3, et confirme que le verdict change aussi.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Quelle syntaxe utilise la valeur par défaut access.log quand aucun premier argument n'est passé ?

Question 2Quelle syntaxe lit un fichier une ligne à la fois et la traite ?

Question 3Comment signales-tu à l'appelant qu'il y a un problème quand le seuil est dépassé ?