Formatar e exibir texto com o comando printf no terminal e em scripts
Formatar e exibir texto com o comando printf em Shell Scripting e no Terminal do Linux
O comando printf no Linux é uma ferramenta interna (built-in) do shell Bash e de outros como Ksh e Zsh que permite formatar e exibir uma saída de texto.
Este comando é útil para exibir informações em um formato específico no terminal, como por exemplo tabelas e relatórios.
Sintaxe
A sintaxe básica do comando “printf” é a seguinte:
$ printf FORMATO [ARGUMENTOS]
onde FORMATO é a string de formato que especifica como a saída será exibida, podendo conter caracteres normais a serem impressos na saída, caracteres de escape, flags e especificações de conversão, para descrição do formato da saída.
Os ARGUMENTOS (opcionais) são passados para os especificadores de formato e correspondem aos valores que serão exibidos de acordo com o formato especificado.
Exemplo:
$ printf "Dia da semana: %s\nHorário: %s\n" Sábado 11:00
Saída:
Dia da semana: Sábado Horário: 11:00
Neste exemplo, o formato é a string Dia da semana: %s\nHorário: %s\n ao passo que “Sábado” e “11:00” são os argumentos. A string de formato possui caracteres de quebra de linha \n e dois especificadores de formato %s, que são substituídos pelos argumentos.
Caracteres de Escape
Os caracteres de escape mais comuns usados com printf são:
- \\ – Mostra um caractere de barra invertida
- \b – Backspace
- \n – Nova linha (quebra de linha)
- \r – Retorno de carro
- \t – Tabulação horizontal
- \v – Tabulação vertical
Especificações de formato
Uma especificação de formato tem a seguinte sintaxe:
%[flags][largura][.precisão]especificador
O especificador é um caractere que especifica como deve ser feita a interpretação do argumento correspondente. Este é um caractere obrigatório, sempre posicionado após os outros campos (diretivas, que são opcionais).
A seguir temos uma lista com alguns tipos de especificadores de conversão:
- %d – Imprime o argumento no formato de um inteiro decimal com sinal
- %i – Idem ao %d
- %u – Formato de um inteiro decimal sem sinal
- %o – Formato de um inteiro octal sem sinal
- %x – Formato de um inteiro hexadecimal sem sinal, com letras minúsculas
- %X – Idem %x, porém com letras maiúsculas
- %e – Formato de ponto flutuante em notação exponencial, com letras minúsculas
- %E – Idem %e, porém com letras maiúsculas
- %g, %G – Imprime o argumento com um número de ponto flutuante ou em notação exponencial, o que for mais adequado dependendo do valor e precisão fornecidos. $g imprime letras minúsculas e %G, maiúsculas.
- %c – Imprime o argumento com um caractere único
- %f – Formato de número de ponto flutuante.
- %s – Imprime o argumento como string
- %% – Imprime o símbolo literal %
Por exemplo, podemos imprimir um valor numérico em sistemas de numeração diferentes da seguinte forma:
$ printf "Decimal: %d\nHex: %x\nOctal: %o\n" 32 32 32
Saída:
Decimal: 32 Hex: 20 Octal: 40
No exemplo o número inteiro 32 é impresso nos sistemas decimal, hexadecimal e octal, respectivamente, pelo uso dos especificadores %d, %x e %o.
Diretiva de flags
A diretiva de flags (opcional) é empregada para realizar o ajuste de alinhamento, prefixos, preenchimento de zeros, etc.
Algumas das flags mais comuns incluem:
- – Alinha o texto impresso à esquerda dentro do campo – por padrão, o texto é alinhado à direita.
- + Precede os números exibidos com um sinal de + (números negativos são precedidos automaticamente por um sinal de -)
- 0 Preenche com zeros em vez de espaços em branco
Diretiva largura
A diretiva de largura é posicionada após qualquer caractere de flag, e especifica o número mínimo de caracteres que devem resultar na conversão.
Se a string de saída for menor que a largura especificada, será automaticamente preenchida com espaços em branco à esquerda. Vejamos um exemplo:
$ printf "%15s %d\n" Fábio 45
Saída:
Fábio 45
Neste exemplo %15s significa que a largura deve ser de 15 caracteres. Como os valores “Fábio” e 305 possuem menos de 15 caracteres quando combinados, espaços à esquerda serão adicionados até completar essa largura ao exibir o resultado.
A saída é alinhada à direita por padrão; podemos alinhá-la á esquerda com o flag – (%-15s).
Diretiva de precisão
Esse modificador consiste em um ponto (.) seguido por um número inteiro positivo ou um asterisco, usados para ajustar a quantidade de caracteres numéricos, de string, ou a quantidade de casas decimais a serem mostradas.
A precisão funciona da seguinte forma:
- Se o tipo de conversão for um número inteiro, a precisão irá especificar a quantidade mínima de dígitos a serem impressos, acrescentando zeros à direita se necessário.
- Caso o tipo de conversão seja um número de ponto flutuante, a precisão irá especificar a quantidade de dígitos após o caractere de separação decimal (ou seja, as casas decimais). A precisão padrão é 6.
- E se o tipo da conversão for uma string, a precisão irá especificar o número máximo de caracteres a serem impressos. caso o número de caracteres no argumento seja maior que a precisão, a string será truncada (cortada).
Vejamos um exemplo:
$ printf "O valor de pi é %.4f \n" 3,14159265359
Saída:
O valor de pi é 3,1416
Note que o valor foi arredondado para 3,1416.
Se usarmos um asterisco, o valor da precisão será fornecido por um argumento de precisão que precede o argumento a ser formatado. Modificando o exemplo anterior teríamos:
$ printf "O valor de pi é %.*f" 4 3,14159265359
Saída:
O valor de pi é 3.1416
Exemplos de uso do comando printf em scripts
Vejamos agora exemplos de como usar o comando printf em scripts do shell Bash, para formatar a saída de dados exibida no terminal.
Exemplo 01
#!/bin/bash
printf "%s" "Qual seu nome completo?"
IFS= read -r nome_completo
printf "%s" "Qual sua idade?"
read idade
printf "Nome: %s\nIdade: %d\n" $nome_completo $idade
Neste exemplo, o comando “printf” é usado para formatar a saída do script com o nome e a idade fornecidos por uma pessoa. A string de formato especifica que o primeiro argumento deve ser exibido como uma string (“%s”) e o segundo como um número inteiro (“%d”).
No exemplo acima, o IFS= redefine a variável IFS para que nenhum caractere seja interpretado como separador de campo. Em seguida, o comando read é usado para ler a entrada do usuário e armazená-la na variável “nome_completo”.
Exemplo 02
Vejamos outro exemplo de uso do comando “printf”:
#!/bin/bash
printf "%-15s %5s\n" "Nome" "Idade"
printf "%-15s %5d\n" "João" 30
printf "%-15s %5d\n" "Maria" 25
Neste exemplo, o comando “printf” é usado para exibir uma tabela com o nome e a idade de duas pessoas. A string de formato especifica que o primeiro argumento deve ser exibido como uma string com largura de 15 caracteres e alinhado à esquerda (“%15s“) e o segundo como um número inteiro com largura de 5 caracteres e alinhado à direita (“%5d“).
Conclusão
O comando printf pode ser combinado com outras ferramentas do Bash Shell (e outros shells) para criar scripts mais avançados, como loops e condicionais. O importante é entender como o comando funciona e como ele pode ser usado para formatar e exibir uma saída de texto.
Escreva um comentário