Apprenez en lisant dans l'ordre

Sortie et rapports — écrire avec printf et here-doc

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.
Aligne les colonnes avec printf '%s\t%s\n', ajoute les résultats avec > et >>, sépare les erreurs avec 2>, et intègre $(wc -l) dans un modèle here-doc pour construire un rapport d'agrégation — illustré et pratiqué dans un terminal en navigateur.

Mettre en forme sa sortie — printf et redirection de la sortie

Pour afficher lisiblement le résultat d'un script, choisis entre echo, qui affiche une chaîne telle quelle, et printf, qui prend un format et aligne les largeurs et les séparateurs.

Si tu veux juste la valeur d'une variable sur une ligne, echo "$v" suffit.

Si tu écris printf '%s\t%s\n' name age, les arguments viennent remplir les %s dans l'ordre, \t devient une tabulation et \n un saut de ligne.

Contrairement à echo, printf n'ajoute pas de saut de ligne à ta place, donc écris toujours \n en fin de ligne.

La sortie d'une commande passe par deux flux : la sortie standard et l'erreur standard.

> file écrase un fichier avec la sortie standard, >> file ajoute à la fin, et 2> file redirige uniquement l'erreur standard vers un autre fichier.

Envoie les résultats normaux vers le rapport et les erreurs dans leur propre fichier : retrouver la cause d'un problème plus tard devient bien plus simple.

vi fmt.sh   # ouvre le fichier dans un éditeur, écris ceci, puis enregistre avec :wq
#   #!/bin/sh
#   printf '%s\t%s\n' name age      # en-tête séparé par une tabulation
#   printf '%s\t%s\n' alice 30      # ligne de données, alignée
#   echo "done" >> fmt.log           # ajouter au log
chmod +x fmt.sh
./fmt.sh
Rediriger la sortie
résultat normalsortie standard> écrase>> ajouteerreurerreur standard2> err.logvers le rapporterreurs dans leur fichier
Les résultats normaux vont vers le rapport avec > (écraser) ou >> (ajouter), et les erreurs sont séparées vers un autre fichier avec 2>.
SyntaxeSignificationExemple
echo "$v"Afficher une variable ou une chaîne telle quelleecho "$name"
printf "%s\t%s\n" a bAfficher avec un format (tabulation et saut de ligne explicites)printf '%s\t%s\n' name age
> fÉcraser un fichier avec la sortie standardecho line > report.txt
>> fAjouter la sortie standard à la fin d'un fichierecho more >> report.txt
2> errSéparer uniquement l'erreur standard vers un autre fichiercat missing 2> err.log

Construis et lance un script qui affiche une sortie formatée et la redirige au bon endroit.

① Ouvre format.sh avec vi format.sh, appuie sur i pour passer en mode insertion, écris la sortie formatée et l'écriture du rapport, 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 format.sh.

③ Lance-le avec ./format.sh et regarde la sortie formatée à l'écran.

④ Vérifie le contenu du rapport écrit avec cat table.txt. (Exécute-le correctement et l'explication apparaîtra.)

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

Réunir un rapport d'agrégation dans un fichier — here-doc et substitution de commande

Pour un rapport à la mise en page fixe, écris le modèle sous forme de here-doc et intègre les résultats de commandes à l'intérieur.

Les lignes que tu écris entre <<EOF et EOF (comme dans cat > report.txt <<EOF … EOF) deviennent le contenu du fichier telles quelles, et là où tu écris $(...), le résultat de l'exécution se développe sur place.

Un <<EOF sans guillemets développe les variables et les substitutions de commande ; <<'EOF' (avec des guillemets simples) ne développe rien et affiche le texte littéralement.

Récupère les valeurs agrégées comme les comptages et les sommes en plaçant wc -l ou grep -c dans une substitution de commande.

Une fois le rapport écrit, indique à l'appelant, avec un code de sortie exit, si le travail a réussi ou non.

exit 0 signifie succès et exit 1 signifie qu'un problème est survenu : un && placé à la suite ou un job de CI peut alors en tenir compte.

vi summary.sh   # ouvre le fichier dans un éditeur, écris ceci, puis enregistre avec :wq
#   #!/bin/sh
#   log=access.log
#   lines=$(wc -l < "$log")          # compter les lignes
#   cat > summary.txt <<REPORT       # intégrer la valeur dans le modèle
#   --- access summary ---
#   total lines: $lines
#   REPORT
#   echo "summary.txt created"
#   exit 0
chmod +x summary.sh
Intégrer un résultat agrégé dans un here-doc
access.logcompter avec$(wc -l)total = 5<<EOF … EOFintégrer $totalreport.txt est prêtagrégerintégrer dans le modèle
La valeur comptée par $(wc -l) est intégrée à l'emplacement $(...) du modèle here-doc, réunissant tout dans un seul rapport.
SyntaxeSignificationExemple
<<EOF … EOFhere-doc qui développe variables et substitutions de commandecat <<EOF > t.txt
<<'EOF' … EOFhere-doc qui ne développe rien et affiche le texte littéralementcat <<'EOF' > t.txt
$(wc -l < f)Récupérer une valeur agrégée par substitution de commanden=$(wc -l < access.log)
exit 0 / exit 1Renvoyer un code de sortie de succès ou d'échecexit 0

Agrège des comptages depuis un log, intègre-les dans un modèle here-doc, et réunis le rapport dans un seul fichier.

① Crée le log d'exemple avec printf 'GET /a 200\nGET /b 404\nGET /c 200\nGET /d 500\nGET /e 200\n' > access.log.

② Ouvre report.sh avec vi report.sh et appuie sur i pour passer en mode insertion. Écris le traitement qui agrège les comptages par substitution de commande et les intègre dans un modèle here-doc, 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 avec ./report.sh, puis vérifie les valeurs agrégées et le modèle dans le report.txt généré avec cat report.txt.

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

Séparer la sortie standard et les erreurs en deux fichiers

Quand une seule commande produit en même temps des résultats normaux et des erreurs, écris > ok.txt 2> err.txt : la sortie standard est enregistrée dans ok.txt tandis que l'erreur standard part dans err.txt.

Comme tu peux ensuite consulter séparément les résultats et les problèmes, cette forme revient souvent quand on conçoit la journalisation des scripts d'exploitation.

ls /etc /no_such_dir > ok.txt 2> err.txt   # la liste vers ok.txt, les erreurs vers err.txt
cat ok.txt                                  # la liste de /etc (sortie standard)
cat err.txt                                 # erreur de /no_such_dir (erreur standard)
Séparer les deux flux d'une même commande
ls /etc /no_suchok.txt(résultats)err.txt(problèmes)> sortie standard2> erreur standard
La sortie standard d'une même commande peut aller vers > ok.txt et son erreur standard vers 2> err.txt, enregistrées séparément en même temps.
SyntaxeSignificationExemple
cmd > ok 2> errEnvoyer sortie standard et erreur standard d'un coup vers deux fichiersls /etc > ok.txt 2> err.txt
echo "…" 1>&2Envoyer un message du côté de l'erreur standardecho failed 1>&2

Construis et lance un script qui redirige la sortie standard et les erreurs d'une même commande vers deux fichiers.

① Ouvre split.sh avec vi split.sh, appuie sur i pour passer en mode insertion, écris le traitement qui redirige la sortie standard et les erreurs vers des fichiers séparés, 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 split.sh.

③ Lance-le avec ./split.sh et regarde à l'écran le nombre de lignes de ok.txt et de err.txt.

④ Vérifie le contenu de la sortie standard avec cat ok.txt et celui des erreurs avec cat err.txt.

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

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Dans printf '%s\t%s\n' a b, que signifient \t et \n ?

Question 2Quelle syntaxe redirige uniquement l'erreur standard d'une commande vers un autre fichier ?

Question 3Quand tu veux intégrer le résultat de $(...) dans un modèle here-doc, quel délimiteur d'ouverture utilises-tu ?