Postagem em destaque

Criando bot do Telegram em Shell script com ShellBot

Formatando texto em colunas

A exibição de informações na tela durante ou após a execução de um comando ou script é importante para entendermos o que está acontecendo ou depurar um possível erro. Mas para que isso seja útil é necessário a organização desses dados antes de serem retornados ao usuário, senão perderíamos muito tempo só procurando a informação que queremos.

A forma mais eficaz de organizar informações é separando em colunas, onde o elemento de cada linha fica alinhado ao grupo (coluna) a que pertence.


Para essa demonstração escolhi o arquivo '/etc/passwd', onde o sistema armazena as informações dos usuários. Como o conteúdo do arquivo é muito extenso, vou copiar só as dez primeiras linhas, criando um novo arquivo chamado 'info'.

$ cat /etc/passwd  | head -n10 > info

Visualizando.

$ cat info
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

Note que as informações de cada usuário são separadas por um delimitador ':' (dois-pontos).

Se pegar a primeira linha e separar os campos removendo todos os delimitadores, obteria o seguinte padrão.


1º campo 2º campo 3º campo 4º campo
campo
6º campo 7º campo
Usuário Padrão UID GID Informações Home Shell
root x 0 0 root /root /bin/bash

Dessa forma, temos uma visão mais clara do arquivo; isso irá nos auxiliar no momento de montar  a linha de comando.

Usando o comando 'printf' para criar a formatação das colunas, seguindo a sintaxe:

printf '%TAMs ...' EXPRESSAO...

%s Interpretador de string.
TAM Espaço a ser alocado para a coluna.
EXPRESSAOUma variável ou constante contendo uma cadeia de caracteres.

O valor a ser alocado determina o total de caracteres que uma coluna irá suportar

Valores:

Coluna usuário padrão UID GID Informações Home Shell
Tamanho 10 1 5 5 18 18 18

Para que o comando 'printf' interprete as colunas, é necessário remover todos os delimitadores ':' entre os campos, deixando um espaço entre eles; para isso vou utilizar o comando 'cut'.

Testando.
 
$ cut -d':' -f1- --output-delimiter=' ' info
root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologin
bin x 2 2 bin /bin /usr/sbin/nologin
sys x 3 3 sys /dev /usr/sbin/nologin
sync x 4 65534 sync /bin /bin/sync
games x 5 60 games /usr/games /usr/sbin/nologin
man x 6 12 man /var/cache/man /usr/sbin/nologin
lp x 7 7 lp /var/spool/lpd /usr/sbin/nologin
mail x 8 8 mail /var/mail /usr/sbin/nologin
news x 9 9 news /var/spool/news /usr/sbin/nologin

Listei o conteúdo do arquivo, substituindo o delimitador de entrada ':' (dois-pontos) pelo delimitador de saída ' ' (espaço), com isso separamos os campos.

Agora com a linha de comando do 'cut' montada e funcionando, podemos partir para o 'printf', criando os cabeçalhos das tabelas.

O cabeçalho é muito simples, basta seguir os valores de alocação definidos anteriormente para as colunas e aplicar  ao título.

Assim, os cabeçalhos ficaram alinhados com as suas respectivas colunas.

Vou montar o pequeno script para que você possa entender o que estou dizendo.

Script: coluna.sh

#!/bin/bash

# Arquivo criado
ARQ=./info

# Cabeçalho
printf '%10s %5s %5s %8s %10s %18s %18s\n' 'USUARIO' 'P' 'UID' 'GID' 'INFO' 'HOME' 'SHELL'

# Informações (colunas)
printf '%10s %5s %5s %8s %10s %18s %18s\n' $(cut -d':' -f1- --output-delimiter=' '  $ARQ)

Executando o script:

Saída

As colunas foram criadas com os valores devidamente alinhados e com certeza ficou bem melhor para ler as informações.

E se eu disser que existe uma forma mais simples de fazer isso ?!
 Sei que deve estar se perguntando.
-Se tinha algo mais simples, porque optamos pelo mais difícil ?!  '@#$%#'
 
Calma jovem, essa é a beleza do Shell, permitir ao usuário fazer a mesma coisa de formas diferentes.

Sem mais demoras, te apresento o comando 'column' !!!! Nome sugestivo né não ??

O comando column é um utilitário que formata sua entrada em várias colunas, onde as linhas são preenchidas antes das colunas.

Sintaxe: column [-tx] [-c columns] [-s sep] [file ...]

Os parâmetros que iremos utilizar são:

-s Especifica o caractere usado como delimitador.
-tDetermina o total de colunas a serem criadas.
fileNome do arquivo a ser tratado.

Saída

A partir do momento que informamos ao parâmetro '-s' o delimitador ':' (dois-pontos), o comando separou os campos e calculou o tamanho em caracteres para cada coluna de forma automática.

A diferença na exibição das informações, é que o 'printf' imprime os campos alinhados a direita, enquanto o column é alinhado à esquerda.

Essa foi uma simples demonstração de como formatar seu texto em colunas e ao mesmo tempo que seja útil para você.

Comentários

Contato

Nome

E-mail *

Mensagem *