Printf
| Fiche express | |
|---|---|
| Domaine | Formatage de sortie (shell) |
| Commande | printf
|
| Contexte | Alternative portable à echo -e pour un affichage précis (padding, précision, couleurs ANSI...)
|
| Voir aussi | Awk (même syntaxe de format) |
printf formate une sortie selon un gabarit ("format") dans lequel des spécificateurs
(%s, %d, %f...) sont remplacés par les arguments
fournis. Contrairement à echo, son comportement est portable d'un shell à
l'autre et il permet de contrôler précisément largeur, précision et remplissage.
Syntaxe de base
printf "format" argument1 argument2 ...
Si le format contient plus de spécificateurs que d'arguments fournis, ceux en trop sont traités comme vides ; si le format est réutilisé pour consommer plusieurs arguments, printf le répète automatiquement jusqu'à épuisement de la liste.
Spécificateurs de format
%s— chaîne de caractères%d/%i— entier décimal%f— nombre à virgule flottante%x/%X— entier en hexadécimal (minuscules / majuscules)%o— entier en octal%c— un seul caractère%%— le caractère%littéral
Modificateurs de largeur et précision, à placer entre le % et la lettre :
%-Ns— chaîne alignée à gauche sur N caractères (complétée par des espaces)%0Nd— entier complété par des zéros à gauche sur N chiffres%.Nd— équivalent, précision N appliquée à un entier (zéro-remplissage)%.Nf— nombre flottant avec N décimales
Exemples : formatage de nombres
Nblign=$(printf "%.8d" "$NBLIGN") # zéro-rempli sur 8 chiffres, ex: 00000042
Nblign=$(printf "%.2f" "$NBLIGN") # 2 décimales, ex: 42.00
printf "Pi avec deux décimales = %1.2f\n" "$PI"
Exemple : colonnes de largeur fixe
Utile pour générer des lignes à format fixe (export vers un système tiers, fichier plat...) :
printf "5DS31%-3s%-6s%-8s%-8s%-8s%-8s00BATCH\n" "" "$EXP_NAME" "" "" "$Z_DATE1" ""
Chaque %-Ns réserve N caractères alignés à gauche pour le champ correspondant,
même si l'argument est une chaîne vide — pratique pour respecter un format en colonnes fixes.
Couleurs ANSI
printf permet aussi de générer des séquences d'échappement ANSI pour colorer
la sortie terminal, sans dépendre des options -e d'echo :
printf '\033[%sm%s\033[m\n' "31" "hello" # rouge
printf '\033[%sm%s\033[m\n' "32" "hello" # vert
printf '\033[%sm%s\033[m\n' "33" "hello" # jaune
printf '\033[%sm%s\033[m\n' "34" "hello" # bleu
printf '\033[%sm%s\033[m\n' "35" "hello" # violet
printf '\033[%sm%s\033[m\n' "36" "hello" # bleu ciel
printf '\033[%sm%s\033[m\n' "37" "hello" # gris
Les codes 40 à 47 appliquent la même palette en surlignage (fond coloré) plutôt qu'en couleur de texte :
printf '\033[%sm%s\033[m\n' "41" "hello" # surligné rouge
printf '\033[%sm%s\033[m\n' "42" "hello" # surligné vert
printf '\033[%sm%s\033[m\n' "43" "hello" # surligné jaune
printf '\033[%sm%s\033[m\n' "44" "hello" # surligné bleu foncé
printf '\033[%sm%s\033[m\n' "45" "hello" # surligné violet
printf '\033[%sm%s\033[m\n' "46" "hello" # surligné bleu ciel
printf '\033[%sm%s\033[m\n' "47" "hello" # surligné gris
Fonction réutilisable dans un script
Pour éviter de retaper la séquence d'échappement à chaque appel, on peut définir une fonction wrapper dans le script :
color()
{
# 31=rouge, 32=vert, 33=jaune, 34=bleu, 35=violet, 36=cyan, 37=blanc
printf '\033[%sm%s\033[m\n' "$@"
}
color 32 "hello"
echo "TEST TRUC MUCHE : $(color 32 OK)"
echo "TEST TRUC MUCHE : $(color 31 NOK)"
Voir aussi
- Awk — awk dispose de sa propre instruction printf, avec une syntaxe de format quasi identique