<Précédent | Table des matières | Suivant>
printf – Formater et imprimer les données
Contrairement aux autres commandes de ce chapitre, la printf La commande n'est pas utilisée pour les pipelines (elle n'accepte pas les entrées standard) et ne trouve pas d'application fréquente directement sur la ligne de commande (elle est principalement utilisée dans les scripts). Alors pourquoi est-ce important ? Parce qu'il est si largement utilisé.
printf (de l'expression « print formated ») a été développé à l'origine pour le langage de programmation C et a été implémenté dans de nombreux langages de programmation, y compris le shell. En fait, dans bash, printf est une fonction intégrée.
printf fonctionne comme ceci :
printf "le format » arguments
La commande reçoit une chaîne contenant une description de format qui est ensuite appliquée à une liste d'arguments. Le résultat formaté est envoyé vers la sortie standard. Voici un exemple trivial :
[moi@linuxbox ~]$ printf "J'ai formaté la chaîne : %s\n" foo
J'ai formaté la chaîne : foo
[moi@linuxbox ~]$ printf "J'ai formaté la chaîne : %s\n" foo
J'ai formaté la chaîne : foo
La chaîne de formatage peut contenir du texte littéral (comme « J'ai formaté la chaîne : »), des séquences d'échappement (comme \n, un caractère de nouvelle ligne) et les séquences commençant par le % caractère, qui sont appelés spécifications de conversion. Dans l'exemple ci-dessus, la spécification de conversion %s est utilisé pour formater la chaîne « foo » et la placer dans la sortie de la commande. Le voici à nouveau :
[moi@linuxbox ~]$ printf "J'ai formaté '%s' sous forme de chaîne.\n" foo
J'ai formaté 'foo' sous forme de chaîne.
[moi@linuxbox ~]$ printf "J'ai formaté '%s' sous forme de chaîne.\n" foo
J'ai formaté 'foo' sous forme de chaîne.
Comme nous pouvons le voir, le %s la spécification de conversion est remplacée par la chaîne « foo » dans la sortie de la commande. La conversion s est utilisée pour formater les données de chaîne. Il existe d'autres spécificateurs pour d'autres types de données. Ce tableau répertorie les types de données couramment utilisés :
Tableau 21-4 : Spécificateurs de type de données printf courants
Spécification Description
Spécification Description
d Formatez un nombre sous forme d'entier décimal signé.
f Formatez et sortez un nombre à virgule flottante.
o Formater un entier sous forme de nombre octal.
s Mettre en forme une chaîne.
x Formatez un entier sous forme de nombre hexadécimal en utilisant af minuscule si nécessaire.
X Pareil que x mais utilisez des majuscules.
% Imprimez un symbole % littéral (c'est-à-dire, spécifiez « %% »)
Nous allons démontrer l'effet de chacun des spécificateurs de conversion sur la chaîne « 380 » :
[moi@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380
+380 (380)XNUMX XNUMX
380, 380.000000, 574, 380, 17c, 17C
[moi@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380
+380 (380)XNUMX XNUMX
380, 380.000000, 574, 380, 17c, 17C
Puisque nous avons spécifié six spécificateurs de conversion, nous devons également fournir six arguments pour
printf à traiter. Les six résultats montrent l'effet de chaque spécificateur.
Plusieurs composants facultatifs peuvent être ajoutés au spécificateur de conversion pour ajuster sa sortie. Une spécification de conversion complète peut comprendre les éléments suivants :
%[drapeaux][largeur][.précision]conversion_spécification
Plusieurs composants facultatifs, lorsqu'ils sont utilisés, doivent apparaître dans l'ordre spécifié ci-dessus pour être correctement interprétés. Voici une description de chacun :
Tableau 21-5 : Composants de la spécification de conversion printf
Description des composants
Description des composants
drapeaux Il existe cinq drapeaux différents :
# – Utilisez le « format alternatif » pour la sortie. Cela varie selon le type de données. Pour la conversion o (nombre octal), la sortie est préfixée par
0. Pour les conversions x et X (nombre hexadécimal), la sortie est préfixée respectivement par 0x ou 0X.
0–(zéro) Complétez la sortie avec des zéros. Cela signifie que le champ sera rempli de zéros non significatifs, comme dans « 000380 ».
- – (tiret) Alignez la sortie à gauche. Par défaut, printf aligne la sortie à droite.
' ' – (espace) Produire un espace de début pour les nombres positifs.
+ – (signe plus) Signez les nombres positifs. Par défaut, printf uniquement
signe des nombres négatifs.
width Un nombre spécifiant la largeur minimale du champ.
.précision Pour les nombres à virgule flottante, spécifiez le nombre de chiffres de précision à sortir après la virgule décimale. Pour la conversion de chaîne, avec précision spécifie le nombre de caractères à sortir.
Voici quelques exemples de différents formats en action :
Tableau 21-6 : Exemples de spécifications de conversion d'impression
Argument | Format | Résultat | Notes |
380 | "%ré" | 380 | Formatage simple d'un |
entier. | |||
380 | "%#X" | 0x17c | Entier formaté comme un |
nombre hexadécimal utilisant | |||
le drapeau « format alternatif ». | |||
380 | "%05d" | 00380 | Entier formaté avec |
zéros non significatifs (remplissage) | |||
et une largeur de champ minimale | |||
de cinq personnages. | |||
380 | "%05.5f" | 380.00000 | Nombre formaté comme un |
nombre à virgule flottante avec | |||
remplissage et cinq décimales | |||
lieux de précision. Depuis | |||
le minimum spécifié | |||
la largeur du champ (5) est inférieure à | |||
la largeur réelle du | |||
nombre formaté, le | |||
le rembourrage n'a aucun effet. | |||
380 | "%010.5f" | 0380.00000 | En augmentant le |
largeur de champ minimale à 10 | |||
le rembourrage est maintenant visible. | |||
380 | "%+d" | +380 | Le drapeau + signe un positif |
. | |||
380 | "%-ré" | 380 | Le drapeau - à gauche aligne le |
formatage. |
abcdefghijk | "%5s" | abcedfghijk | Une chaîne formatée avec une largeur de champ minimale. |
abcdefghijk | "%.5s" | a B c d e | En appliquant une précision à une chaîne, elle est tronquée. |
Encore une fois, printf est principalement utilisé dans les scripts où il est utilisé pour formater des données tabulaires, plutôt que sur la ligne de commande directement. Mais nous pouvons toujours montrer comment il peut être utilisé pour résoudre divers problèmes de formatage. Tout d'abord, affichons quelques champs séparés par des tabulations :
[moi@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3
str1 str2 str3
[moi@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3
str1 str2 str3
En insérant \t (la séquence d'échappement pour un onglet), nous obtenons l'effet souhaité. Ensuite, quelques chiffres avec une mise en forme soignée :
[moi@linuxbox ~]$ printf "Ligne : %05d %15.3f Résultat : %+15d\n" 1071 3.14156295 32589
Ligne : 01071 3.142 Résultat : +32589
[moi@linuxbox ~]$ printf "Ligne : %05d %15.3f Résultat : %+15d\n" 1071 3.14156295 32589
Ligne : 01071 3.142 Résultat : +32589
Cela montre l'effet de la largeur de champ minimale sur l'espacement des champs. Ou que diriez-vous de formater une petite page Web :
[moi@linuxbox ~]$ printf " \NT \n\t\t %s \n
\t \NT \n\t\t %s \NT \n \n" "Titre de la page" "Contenu de la page"
Titre de la page
Contenu de la page
[moi@linuxbox ~]$ printf " \NT \n\t\t %s \n
\t \NT \n\t\t %s \NT \n \n" "Titre de la page" "Contenu de la page"
Titre de la page
Contenu de la page