Formate automaticamente a saída dos seus comandos Linux em tabelas

As tabelas são das formas mais simples de se organizar informações.
Muitos comandos ou sequências de comandos, dados para obter informações sobre o comportamento do hardware ou do software, podem oferecer uma saída de dados um pouco confusa, à primeira vista.
Com o uso do comando grep, contudo, é possível filtrar a parte que interessa das informações, como já ensinei antes.
Mas, quando se precisa obter informações ordenadas, em vez de “filtradas”, o comando column pode ser mais útil.
Veja um exemplo de seu uso, associado ao comando mount.


mount | column -t

sysfs        on  /sys                             type  sysfs            (rw,nosuid,nodev,noexec,relatime)
proc         on  /proc                            type  proc             (rw,nosuid,nodev,noexec,relatime)
udev         on  /dev                             type  devtmpfs         (rw,nosuid,relatime,size=3925308k,nr_inodes=981327,mode=755)
devpts       on  /dev/pts                         type  devpts           (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs        on  /run                             type  tmpfs            (rw,nosuid,noexec,relatime,size=787320k,mode=755)
/dev/sdb1    on  /                                type  btrfs            (rw,relatime,ssd,space_cache,subvolid=5,subvol=/)
/dev/sda1    on  /home                            type  btrfs            (rw,relatime,space_cache,subvolid=5,subvol=/)
binfmt_misc  on  /proc/sys/fs/binfmt_misc         type  binfmt_misc      (rw,relatime)
tmpfs        on  /run/user/119                    type  tmpfs            (rw,nosuid,nodev,relatime,size=787316k,mode=700,uid=119,gid=124)
tmpfs        on  /run/user/1000                   type  tmpfs            (rw,nosuid,nodev,relatime,size=787316k,mode=700,uid=1000,gid=1000)
gvfsd-fuse   on  /run/user/1000/gvfs              type  fuse.gvfsd-fuse  (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
fusectl      on  /sys/fs/fuse/connections         type  fusectl          (rw,relatime)


Experimente também com o ls:


ls -lah | column -t

total       52K
drwxr-xr-x  1    justincase  justincase  350   set  19  10:31  .
drwxr-xr-x  1    justincase  justincase  1,8K  set  25  16:22  ..
drwxr-xr-x  1    justincase  justincase  4,1K  set  19  16:17  Complete-Python-Bootcamp-master
-rw-r--r--  1    justincase  justincase  360   set  19  10:31  dict_bd_enderecos.py
-rw-r--r--  1    justincase  justincase  115   jun  9   16:17  for-colors.sh
-rwxr-xr-x  1    justincase  justincase  8,8K  jun  13  09:10  hello
-rw-r--r--  1    justincase  justincase  29    set  10  13:03  hello.py
-rw-r--r--  1    justincase  justincase  138   jun  16  17:26  helloworld.f95
-rw-r--r--  1    justincase  justincase  340   jun  20  10:51  meups1.sh
-rw-r--r--  1    justincase  justincase  195   jun  9   17:34  mon-logf.sh
-rw-r--r--  1    justincase  justincase  625   jun  13  15:15  pinghosts.sh
drwxr-xr-x  1    justincase  justincase  168   set  6   17:48  PYTHON
-rw-r--r--  1    justincase  justincase  49    jun  9   16:21  sctchange.sh
-rw-r--r--  1    justincase  justincase  128   jun  9   16:40  until-contador.sh
-rw-r--r--  1    justincase  justincase  130   jun  9   16:26  while-contador.sh

O ls tem saídas “tradicionalmente arrumadas”, de forma que o column apenas melhora o aspecto inserindo tabulações nos espaços.

O utilitário column formata o resultado em múltiplas colunas, dando-lhes um aspecto de tabela organizada, com o objetivo de facilitar a leitura.

Seu uso pode ser incorporado permanentemente, com o comando alias.
Veja um exemplo, baseado na página do manual do column:


alias ls="(printf 'Permissões Links Dono Grupo Bytes Mês Dia '; \
printf 'Hora/Ano Arquivo\n_________________________\n'; \
ls -l | sed 1d) | column -t"

Depois disto, experimente rodar o ls:


ls

Permissões                 Links  Dono        Grupo       Bytes  Mês  Dia  Hora/Ano  Arquivo
_________________________
drwxr-xr-x                 1      justincase  justincase  4158   set  19   16:17     Complete-Python-Bootcamp-master
-rw-r--r--                 1      justincase  justincase  360    set  19   10:31     dict_bd_enderecos.py
-rw-r--r--                 1      justincase  justincase  115    jun  9    16:17     for-colors.sh
-rwxr-xr-x                 1      justincase  justincase  9008   jun  13   09:10     hello
-rw-r--r--                 1      justincase  justincase  29     set  10   13:03     hello.py
-rw-r--r--                 1      justincase  justincase  138    jun  16   17:26     helloworld.f95
-rw-r--r--                 1      justincase  justincase  340    jun  20   10:51     meups1.sh
-rw-r--r--                 1      justincase  justincase  195    jun  9    17:34     mon-logf.sh
-rw-r--r--                 1      justincase  justincase  625    jun  13   15:15     pinghosts.sh
drwxr-xr-x                 1      justincase  justincase  168    set  6    17:48     PYTHON
-rw-r--r--                 1      justincase  justincase  49     jun  9    16:21     sctchange.sh
-rw-r--r--                 1      justincase  justincase  128    jun  9    16:40     until-contador.sh
-rw-r--r--                 1      justincase  justincase  130    jun  9    16:26     while-contador.sh

Se quiser tornar este alias permanente, adicione a linha de código ao final do arquivo .bashrc.

O arquivo password tem seus dados separados por ‘:’, porém são muito justos.
Veja como separar isto tudo:


cat /etc/passwd | column -t -s :

Note que foi adicionado um elemento, à linha de comando acima: ‘-s :’
Sua função é indicar que a separação de colunas deve ocorrer sobre o caractere ‘:’.

Como guardar o histórico dos comandos no MySQL

Você pode armazenar o histórico de todos os comandos fornecidos no cliente MySQL, bem como seus resultados, em um arquivo, para uso posterior.
A dica é útil para programadores, que desejem montar scripts em PHP, Perl, Python etc. posteriormente, com o uso das informações obtidas em uma seção de conexão ao servidor do MySQL.
Captura de tela da saída do histórico do MySQL
Ao usar o cliente MySQL, é possível ver o resultado imediato de seus comandos — o que te permite saber o que funciona ou não.
Se você está aprendendo MySQL, pode ser interessante ter uma relação de comandos referentes à sua lição — que pode ser enviado, por email ou qualquer outra forma, para ser analisado por alguém mais experiente e que possa te ajudar com alguma dificuldade.

Execute o MySQL com a opção –tee para gravar seu histórico

O MySQL, por padrão, já grava o histórico dos seus comandos. O que queremos é ter acesso a este histórico, de fora do MySQL — para ter a liberdade de fazer o que quisermos com esta informação.
Para isto, execute o MySQL com a opção --tee, conforme o exemplo abaixo:

mysql -u root -p --tee=MySQL-historico.txt

Destrinchando o comando:

  • mysql -u root -p — rotina tradicional de conexão ao banco de dados.
  • --tee=MySQL-historico.txt — indica ao tee para enviar a saída (log) para o arquivo MySQL-historico.txt. Você pode usar qualquer outro nome que quiser para este artigo.

O log gerado pelo tee descarta uma série de lixo desnecessário, deixando apenas o que interessa gravado no arquivo.

No Unix (e também no Linux), o comando tee lê da entrada padrão e envia para uma saída à sua escolha — que pode ser um arquivo.

Como ligar o logging externo de dentro do MySQL

Se você se esqueceu de desligar o logging em um arquivo externo, é possível fazer isto de dentro do próprio MySQL.
Use os comandos \T e \t para ligar e desligar, respectivamente, o logging em arquivo externo.
No exemplo, abaixo, o logging será feito no arquivo hist.txt:

mysql> \T hist.txt
Logging to file 'hist.txt'
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| tutorial           |
+--------------------+
4 rows in set (0.00 sec)

mysql> \t
Outfile disabled.
mysql> 

Para ver o log, na linha de comando (fora do cliente MySQL), eu posso usar o comando cat:

cat hist.txt 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| tutorial           |
+--------------------+
4 rows in set (0.00 sec)

mysql> \t

Ou, então, posso abrir o arquivo hist.txt com o meu editor favorito.

Captura de tela do editor mousepad com o log do mysql
Clique, para ampliar.

O MySQL acrescenta os novos logs aos já existentes. Ele não sobrescreve o log anterior.
Você precisa apagar o arquivo anterior ou criar um novo, se não quiser que o próximo log seja acrescentado a alguma preexistente.
A capacidade de criar arquivos tee, foi introduzida no MySQL 3.23.28.