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.

Lista com todos os artigos da Bóson Treinamentos

Sobre Fábio dos Reis (1195 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

Escreva um comentário

Seu e-mail não será divulgado


*