Question 1Que met n=$(grep -c error log.txt) dans la variable n ?
Combiner des commandes — agir selon le résultat de grep / awk
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.
Dans un script, mets un nombre dans une variable avec n=$(grep -c ERROR access.log), fais la somme avec total=$(awk '{s+=$1} END{print s}') et laisse if [ "$n" -ge 2 ] prendre la bonne branche — un scanner illustré et pratiqué dans un terminal en navigateur.
Appeler des commandes dans un script — pipes et substitution de commande
La vraie puissance d'un script shell, c'est que tu peux y combiner des commandes courantes comme `grep`, `awk`, `sed`, `sort` et `wc`.
Dans un script aussi, tu enchaînes les commandes avec un pipe | et tu récupères leur sortie avec la substitution de commande $(cmd).
Si tu écris n=$(grep -c error log.txt), le nombre de lignes correspondantes trouvé par grep -c est stocké dans la variable n.
Tu peux aussi mettre un résultat d'agrégation dans une variable, comme total=$(awk '{s+=$1} END{print s}' f).
Une fois le résultat d'une commande dans une variable, tu peux te servir de cette valeur pour changer le comportement du script.
printf 'INFO ok\nERROR disk\nINFO ok\nERROR cpu\n' > sys.log # crée le fichier d'exemple
vi count.sh # ouvre le fichier dans un éditeur, écris ceci, puis enregistre avec :wq
# #!/bin/sh
# n=$(grep -c ERROR sys.log)
# echo "ERROR count: $n"
chmod +x count.sh
./count.sh # ERROR count: 2
grep -c est stocké dans la variable n, et le if prend la branche d'avertissement à partir de 2, sinon il affiche OK.| Syntaxe | Signification | Exemple |
|---|---|---|
n=$(grep -c pat f) | Mettre le nombre de lignes correspondantes dans la variable n | n=$(grep -c error log.txt) |
$(cmd | cmd) | Récupérer le résultat d'un pipe dans une variable | top=$(sort log.txt | head -1) |
if [ "$n" -ge 2 ]; then … | Prendre une branche selon que le nombre atteint 2 ou plus | if [ "$n" -ge 2 ]; then echo warn; fi |
Agréger, puis changer de comportement selon le résultat — awk et branchement
Au-delà des comptages, tu peux aussi additionner des nombres et décider à partir du total.
total=$(awk '{s+=$1} END{print s}' f) additionne la colonne 1 de chaque ligne et met la somme dans la variable total.
Quand tu veux le nombre d'occurrences par mot, trie d'abord, puis compte, avec sort f | uniq -c, et récupère ce résultat avec $(...).
En comparant la somme à un seuil, comme dans if [ "$total" -gt 100 ]; then …, tu peux décider par exemple d'avertir dès que le total dépasse une limite.
Réunis l'agrégation et le branchement dans un seul script : tu obtiens un vrai outil qui lit des données et évalue la situation.
printf '40\n30\n50\n' > sales.txt # données numériques sur une colonne
vi sum.sh # ouvre le fichier dans un éditeur, écris ceci, puis enregistre avec :wq
# #!/bin/sh
# total=$(awk '{s+=$1} END{print s}' sales.txt)
# if [ "$total" -gt 100 ]; then
# echo "total $total: goal met"
# else
# echo "total $total: not met"
# fi
chmod +x sum.sh
./sum.sh # total 120: goal met
printf 'a\na\nb\n' > tags.txt # fichier d'exemple avec des mots répétés
sort tags.txt | uniq -c # trier en premier, puis compter
# Sortie :
# 2 a
# 1 b
if compare le total additionné par awk au seuil 20 : au-dessus il prend la branche « action requise », sinon la branche « dans la limite ».| Syntaxe | Signification | Exemple |
|---|---|---|
awk '{s+=$1} END{print s}' f | Additionner la colonne 1 | awk '{s+=$1} END{print s}' nums.txt |
sort f | uniq -c | Trier avant de compter les occurrences | sort tags.txt | uniq -c |
if [ "$total" -gt N ]; then … | Prendre une branche en comparant le total au seuil N | if [ "$total" -gt 100 ]; then … |
Rediriger la sortie et les erreurs — > et 2>
Tu veux parfois garder le résultat d'un script dans un fichier plutôt qu'à l'écran.
./scan.sh > report.txt écrit la sortie normale (la sortie standard) dans report.txt.
Envoie les messages d'erreur vers l'erreur standard avec echo "..." 1>&2 : avec ./scan.sh > report.txt 2> error.log, tu gardes les résultats normaux et les erreurs dans des fichiers séparés.
vi job.sh # ouvre le fichier dans un éditeur, écris ceci, puis enregistre avec :wq
# #!/bin/sh
# echo "processing started" # sortie standard
# echo "note: input was empty" 1>&2 # erreur standard
chmod +x job.sh
./job.sh > out.txt 2> err.txt # sortie et erreurs vers des fichiers séparés
cat out.txt # processing started
cat err.txt # note: input was empty
> report.txt et l'erreur standard vers 2> error.log, redirigées séparément.| Syntaxe | Signification | Exemple |
|---|---|---|
cmd > out | Écrire la sortie standard dans un fichier | ./scan.sh > report.txt |
echo "…" 1>&2 | Envoyer un message vers l'erreur standard | echo "failed" 1>&2 |
cmd > out 2> err | Rediriger la sortie et les erreurs vers des fichiers séparés | ./scan.sh > report.txt 2> error.log |
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Que fait if [ "$n" -ge 2 ]; then … ?
Question 3Dans ./scan.sh > report.txt 2> error.log, que redirige 2> ?