Printf

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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