Question 1Quelle syntaxe utilise la valeur par défaut access.log quand aucun premier argument n'est passé ?
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
| Élément | Son rôle dans ce script | Exemple |
|---|---|---|
Variable name=... | Garder le nom du log, la destination et le seuil au même endroit | log=${1:-access.log} |
Argument $1 / ${1:-défaut} | Prendre le log cible et le seuil sur la ligne de commande | limit=${2:-1} |
Condition [ -f f ] / if | Vérifier que le log existe et déterminer si le seuil est dépassé | if [ ! -f "$log" ]; then exit 1; fi |
Boucle for / while read | Agréger par code de statut et lire une ligne à la fois | for s in 200 403 500; do … done |
Fonction name() { … } | Regrouper l'agrégation sous un nom et la réutiliser | count_status() { grep -c " $1\$" "$log"; } |
Lecture d'entrée while read … < f | Lire le log ligne par ligne et compter par URL | while read line; do … done < "$log" |
Intégration $(grep -c …) / awk | Récupérer comptages et sommes par substitution de commande | n=$(grep -c ' 500$' "$log") |
Sortie >> / here-doc | Écrire les valeurs agrégées dans un rapport à format fixe | cat > "$out" <<REPORT … REPORT |
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
while read prend les lignes une à une, et la combinaison de grep / awk / sed les transforme en un rapport porteur d'un verdict.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.
-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.Vérification des connaissances
Répondez à chaque question une par une.
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é ?