<Anterior | Conteúdo | Próxima>
printf - Formatar e imprimir dados
Ao contrário dos outros comandos neste capítulo, o printf O comando não é usado para tubos (não aceita entrada padrão) nem encontra aplicativos frequentes diretamente na linha de comando (é usado principalmente em scripts). Então, por que isso é importante? Porque é muito usado.
printf (da frase “print formatted”) foi originalmente desenvolvido para a linguagem de programação C e foi implementado em muitas linguagens de programação, incluindo o shell. Na verdade, em bash, printf é embutido.
printf funciona assim:
printf”formato" argumentos
O comando recebe uma string contendo uma descrição do formato que é então aplicada a uma lista de argumentos. O resultado formatado é enviado para a saída padrão. Aqui está um exemplo trivial:
[me @ linuxbox ~] $ printf "Eu formatei a string:% s \ n" foo
Eu formatei a string: foo
[me @ linuxbox ~] $ printf "Eu formatei a string:% s \ n" foo
Eu formatei a string: foo
A string de formato pode conter texto literal (como “Eu formatei a string:”), sequências de escape (como \n, um caractere de nova linha) e sequências começando com o % personagem, que são chamados especificações de conversão. No exemplo acima, a especificação de conversão %s é usado para formatar a string “foo” e colocá-la na saída do comando. Aqui está de novo:
[me @ linuxbox ~] $ printf "Eu formatei '% s' como uma string. \ n" foo
Eu formatei 'foo' como uma string.
[me @ linuxbox ~] $ printf "Eu formatei '% s' como uma string. \ n" foo
Eu formatei 'foo' como uma string.
Como podemos ver, o %s a especificação de conversão é substituída pela string “foo” na saída do comando. A conversão s é usada para formatar dados de string. Existem outros especificadores para outros tipos de dados. Esta tabela lista os tipos de dados comumente usados:
Tabela 21-4: Especificadores de tipo de dados printf comuns
Descrição do especificador
Descrição do especificador
d Formate um número como um inteiro decimal com sinal.
f Formate e produza um número de ponto flutuante.
o Formate um inteiro como um número octal.
s Formate uma string.
x Formate um inteiro como um número hexadecimal usando af minúsculo quando necessário.
X Igual a x mas use letras maiúsculas.
% Imprime um símbolo% literal (ou seja, especifique “%%”)
Vamos demonstrar o efeito de cada um dos especificadores de conversão na string "380":
[me @ linuxbox ~] $ printf "% d,% f,% o,% s,% x,% X \ n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17c, 17C
[me @ linuxbox ~] $ printf "% d,% f,% o,% s,% x,% X \ n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17c, 17C
Uma vez que especificamos seis especificadores de conversão, devemos também fornecer seis argumentos para
printf para processar. Os seis resultados mostram o efeito de cada especificador.
Vários componentes opcionais podem ser adicionados ao especificador de conversão para ajustar sua saída. Uma especificação de conversão completa pode consistir no seguinte:
%[bandeiras][largura][.precisão] conversão_especificação
Vários componentes opcionais, quando usados, devem aparecer na ordem especificada acima para serem interpretados corretamente. Aqui está uma descrição de cada:
Tabela 21-5: Componentes de especificação de conversão de printf
Descrição do componente
Descrição do componente
sinalizadores Existem cinco sinalizadores diferentes:
# - Use o “formato alternativo” para a saída. Isso varia de acordo com o tipo de dados. Para conversão o (número octal), a saída é prefixada com
0. Para conversões x e X (número hexadecimal), a saída é prefixada com 0x ou 0X respectivamente.
0– (zero) Preencha a saída com zeros. Isso significa que o campo será preenchido com zeros à esquerda, como em “000380”.
- - (traço) Alinhe a saída à esquerda. Por padrão, printf alinha a saída à direita.
'' - (espaço) Produz um espaço inicial para números positivos.
+ - (sinal de mais) Significa números positivos. Por padrão, apenas printf
assina números negativos.
largura Um número que especifica a largura mínima do campo.
.precisão Para números de ponto flutuante, especifique o número de dígitos de precisão a serem produzidos após o ponto decimal. Para conversão de string, precisão especifica o número de caracteres a serem produzidos.
Aqui estão alguns exemplos de diferentes formatos em ação:
Tabela 21-6: Exemplos de especificações de conversão de impressão
Argumento | Formato | Resultado | Notas |
380 | "% d" | 380 | Formatação simples de um |
inteiro. | |||
380 | "% # x" | 0x17c | Inteiro formatado como um |
número hexadecimal usando | |||
o sinalizador de “formato alternativo”. | |||
380 | "% 05d" | 00380 | Inteiro formatado com |
zeros à esquerda (preenchimento) | |||
e uma largura de campo mínima | |||
de cinco caracteres. | |||
380 | "% 05.5f" | 380.00000 | Número formatado como um |
número de ponto flutuante com | |||
preenchimento e cinco decimais | |||
lugares de precisão. Desde a | |||
o mínimo especificado | |||
largura do campo (5) é menor que | |||
a largura real do | |||
número formatado, o | |||
preenchimento não tem efeito. | |||
380 | "% 010.5f" | 0380.00000 | Aumentando o |
largura mínima do campo para 10 | |||
o preenchimento agora está visível. | |||
380 | "% + d" | +380 | A bandeira + sinaliza um sinal positivo |
número. | |||
380 | "% -d" | 380 | O sinalizador - à esquerda alinha o |
formatação. |
abcdefghijk | "% 5s" | Abcedfghijk | Uma string formatada com uma largura de campo mínima. |
abcdefghijk | "% .5s" | abcde | Ao aplicar precisão a uma string, ela é truncada. |
Mais uma vez, printf é usado principalmente em scripts onde é empregado para formatar dados tabulares, em vez de na linha de comando diretamente. Mas ainda podemos mostrar como ele pode ser usado para resolver vários problemas de formatação. Primeiro, vamos mostrar alguns campos separados por caracteres de tabulação:
[me @ linuxbox ~] $ printf "% s \ t% s \ t% s \ n" str1 str2 str3
str1 str2 str3
[me @ linuxbox ~] $ printf "% s \ t% s \ t% s \ n" str1 str2 str3
str1 str2 str3
Inserindo \t (a sequência de escape para uma guia), alcançamos o efeito desejado. A seguir, alguns números com formatação elegante:
[me @ linuxbox ~] $ printf "Linha:% 05d% 15.3f Resultado:% + 15d \ n" 1071 3.14156295 32589
Linha: 01071 3.142 Resultado: +32589
[me @ linuxbox ~] $ printf "Linha:% 05d% 15.3f Resultado:% + 15d \ n" 1071 3.14156295 32589
Linha: 01071 3.142 Resultado: +32589
Isso mostra o efeito da largura mínima do campo no espaçamento dos campos. Ou que tal formatar uma pequena página da web:
[me @ linuxbox ~] $ printf " \ n \ t \ n \ t \ t % s \ n
\ t \ n \ t \ n \ t \ t % s \ n \ t \ n \ n "" Título da página "" Conteúdo da página "
Título da página
Conteúdo da página
[me @ linuxbox ~] $ printf " \ n \ t \ n \ t \ t % s \ n
\ t \ n \ t \ n \ t \ t % s \ n \ t \ n \ n "" Título da página "" Conteúdo da página "
Título da página
Conteúdo da página