Stations de travail en ligne OnWorks Linux et Windows

Logo

Hébergement gratuit en ligne pour les postes de travail

<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é.


image

f Formatez et sortez un nombre à virgule flottante.


image

o Formater un entier sous forme de nombre octal.


image


image

s Mettre en forme une chaîne.


image

x Formatez un entier sous forme de nombre hexadécimal en utilisant af minuscule si nécessaire.


image

X Pareil que x mais utilisez des majuscules.


image

% Imprimez un symbole % littéral (c'est-à-dire, spécifiez « %% »)


image


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 :


image

# – 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.


image

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 ».


image

- – (tiret) Alignez la sortie à gauche. Par défaut, printf aligne la sortie à droite.


image

' ' – (espace) Produire un espace de début pour les nombres positifs.


image

+ – (signe plus) Signez les nombres positifs. Par défaut, printf uniquement


image


image

signe des nombres négatifs.


image

width Un nombre spécifiant la largeur minimale du champ.


image

.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.


image


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


Meilleur système d'exploitation Cloud Computing chez OnWorks :