Linux / Commande printf : formater du texte et des nombres dans le shell
printf affiche du texte et des nombres selon une chaîne de format, par exemple printf '%s\n' "$value". Il permet de choisir les retours à la ligne, l'alignement et la présentation numérique. Il n'ajoute pas automatiquement un saut de ligne : mettez \n dans le format quand il est nécessaire.
Dans Bash, printf est normalement une commande intégrée au shell. Un programme externe GNU Coreutils portant le même nom peut aussi être disponible. Les exemples suivants utilisent la commande intégrée de Bash ; des extensions particulières peuvent varier entre les implémentations.
Identifier la commande et comprendre la syntaxe
printf 'format' [valeurs…]
Vérifiez ce qui sera exécuté dans votre session :
type printf
Dans une session Bash habituelle, le résultat indique un shell builtin, c'est-à-dire une commande intégrée. Une fonction ou un alias peut changer ce choix ; examinez la réponse réelle. help printf décrit la commande intégrée, tandis que man printf peut décrire le programme externe ou une autre interface.
Le premier argument définit la présentation et les suivants fournissent les valeurs. Dans le format, %s attend une chaîne, %d un entier et \n représente un saut de ligne. Les guillemets simples gardent cette syntaxe intacte jusqu'à son interprétation par printf.
Afficher des valeurs et contrôler les lignes
printf 'Hello, %s\n' Linux
Hello, Linux
Le texte fixe est conservé et Linux prend la place de %s. La différence entre une sortie avec ou sans saut de ligne est visible avec deux appels successifs :
printf '%s' alpha
printf '%s\n' beta
La sortie est alphabeta sur une ligne, suivie d'un saut de ligne. L'absence de \n dans le premier appel ne crée aucune séparation entre les valeurs.
Quand des arguments restent à traiter, le format est réutilisé :
printf '%s\n' one two three
one
two
three
Un format qui consomme deux valeurs est lui aussi répété par groupes. Vérifiez donc que le nombre d'arguments correspond à la structure attendue ; une valeur manquante peut être présentée comme une chaîne vide ou un zéro au lieu d'entraîner l'erreur que vous espériez.
Aligner avec une largeur minimale
printf '%-12s %5d\n' apple 42
La chaîne est alignée à gauche dans un champ d'au moins 12 positions ; l'entier est aligné à droite dans un champ d'au moins 5. Le format contient aussi un espace littéral entre les deux champs. Pour observer plus facilement les limites, placez des crochets autour des valeurs :
printf '[%-6s] [%03d]\n' apple 7
[apple ] [007]
%-6s ajoute un espace après apple pour atteindre six positions. %03d remplit l'entier avec des zéros jusqu'à trois positions. Il s'agit de largeurs minimales, pas d'une instruction de découpage :
printf '[%3s] [%03d]\n' banana 1234
[banana] [1234]
Le mot et le nombre dépassent leurs largeurs et sont affichés en entier. Les exemples utilisent des caractères ASCII ; une largeur de champ ne garantit pas le même alignement visuel pour tous les caractères Unicode ou toutes les polices. Pour réorganiser un tableau complet à champs séparés, column et son calcul de largeur peuvent être plus appropriés.
Présenter les nombres et le symbole pour cent
Pour afficher deux chiffres après le séparateur décimal, utilisez une précision avec %f. Fixez la locale si la sortie d'un script doit utiliser le point :
LC_ALL=C printf 'valeur=%.2f\n' 3.14159
valeur=3.14
La précision règle ici la présentation du nombre. Le séparateur décimal et l'interprétation de certaines valeurs dépendent de la locale et de l'implémentation. Dans Bash et GNU printf, les arguments entiers suivent aussi des règles de constantes numériques : un zéro initial peut indiquer une notation octale. Pour un identifiant comme 008 dont tous les caractères doivent rester visibles, utilisez %s au lieu de forcer une conversion entière.
Le symbole pour cent a une signification spéciale dans le format. Doublez-le pour afficher un pour cent littéral :
printf 'progression=%d%%\n' 75
progression=75%
Garder les données séparées du format
Placez le format dans un argument fixe et les données dans des arguments séparés. Ce petit exemple garde le pour cent, la séquence littérale barre oblique inverse-n, l'astérisque et les espaces :
value='100% \n * deux mots'
printf '%s\n' "$value"
100% \n * deux mots
Le %s n'interprète pas la valeur comme une nouvelle chaîne de format. Les guillemets doubles autour de "$value" empêchent aussi le shell de découper sa valeur en plusieurs mots ou de développer l'astérisque en noms de fichiers.
Évitez printf "$value" pour un texte arbitraire : ses pour cent et échappements seraient interprétés comme des instructions de présentation. De même, %b interprète volontairement des échappements dans la valeur ; choisissez %s quand les données doivent être affichées littéralement.
Enregistrer un résultat et retenir les formats
Pour conserver une sortie dans un nouveau fichier sans utiliser vos documents existants :
printf_lab=$(mktemp -d "$HOME/printf-lab.XXXXXX")
printf 'name=%s\ncount=%d\n' Linux 3 > "$printf_lab/result.txt"
cat "$printf_lab/result.txt"
name=Linux
count=3
La redirection écrit ici dans le répertoire neuf. Pour un chemin choisi ailleurs, vérifiez qu'il ne désigne pas un fichier à conserver. La création d'un format lisible ne garantit pas qu'un texte est correctement échappé pour un format d'échange tel que JSON ou CSV.
| Format | Rôle |
|---|---|
%s |
Afficher une chaîne comme donnée. |
%d |
Afficher un entier en notation décimale. |
%.2f |
Afficher un nombre avec deux chiffres après le séparateur décimal. |
%-Ns |
Aligner une chaîne à gauche dans une largeur minimale N. |
%03d |
Remplir un entier avec des zéros jusqu'à une largeur minimale de trois. |
%% |
Afficher un pour cent littéral dans le format. |
\n |
Ajouter un saut de ligne dans le format. |
Le manuel des commandes intégrées de Bash décrit son printf. Pour le programme externe, consultez le manuel de GNU Coreutils printf et vérifiez les différences avant d'employer une extension propre à l'un d'eux.




