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 ‘:’.

Variáveis de ambiente no Linux

As variáveis de ambiente são usadas para armazenar valores, que podem ser usados por scripts, executados a partir da shell.
Algumas variáveis de ambiente já fazem parte do sistema. Outras podem ser criadas por você.
No Bash, há 2 tipos de variáveis de ambiente ou (environment variables):

  1. locais — visíveis apenas dentro da shell, na qual foram criadas.
  2. globais — visíveis a todos os processos em execução numa shell.

Você pode usar o comando printenv, para ver quais são e como estão definidas as variáveis globais no seu ambiente atual:
Veja algumas das minhas:


printenv

LS_COLORS=di=7;32:fi=32:ln=4;32:pi=5;32:so=5;32:bd=5;32:cd=5;32:or=5;32:mi=5;32:ex=1;32:*.png=1;4;32:*.jpg=1;4;32
XDG_MENU_PREFIX=gnome-
LANG=pt_BR.UTF-8
GDM_LANG=pt_BR.UTF-8
DISPLAY=:0
COLORTERM=truecolor
USERNAME=justincase
DESKTOP_SESSION=gnome-xorg
WINDOWPATH=2
TERM=xterm-256color
SHELL=/bin/bash
VTE_VERSION=4602
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-xorg
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
PATH=/opt/Komodo-Edit-10/bin:/opt/Telegram/Telegram:/usr/local/bin:/usr/bin:/bin:/usr/games
_=/usr/bin/printenv

Para ver apenas uma das variáveis, use o comando echo:


echo $HOME

/home/justincase

Experimente ver outras variáveis no seu sistema.
Depois, experimente criar sua primeira variável de sistema:


meusite="https://elias.praciano.com"

echo $meusite

https://elias.praciano.com

Fique atento: os nomes das variáveis são sensíveis à caixa (case sensitive).
Por isso, $meusite e $MEUSITE são coisas totalmente diferentes.
variáveis de ambiente sistema linux

Como prática recomendada, use sempre as letras minúsculas, para nomear as suas variáveis.
Assim você evita confusão com as variáveis do sistema.

Antes de abordarmos o próximo tópico, vale lembrar que as variáveis declaradas em uma sessão ou dentro de uma janela de um console não terão validade em outra sessão ou console.

Como declarar uma variável global

Para definir uma variável global, é necessário declarar (como você já deve saber) uma variável local.
Depois disto, a exportamos com o comando export:


autor='Elias Praciano'
echo $autor

Elias Praciano

export autor

Note que não se usa o ‘$’ à frente do nome da variável, quando a passamos para o comando export.
O último passo, para tornar uma variável persistente entre as sessões, é editar o arquivo ~/.bashrc.
Inclua, ao final dele, a linha com o comando export:


export autor='Elias Praciano'

Após este procedimento, a variável autor poderá ser sempre invocada no seu sistema, com o valor ‘Elias Praciano” — ou até você mudar o seu valor ou remover a linha do arquivo .bashrc.

Como descartar variáveis de ambiente no Linux

O comando unset pode ser usado para remover variáveis da memória do sistema:


echo $autor

Elias Praciano

unset autor
echo $autor

Remova também as declarações referentes à variável do seu arquivo .bashrc, ou ela ressurgirá na próxima sessão.

Use o calendário incluído na shell CLI do Android

A shell mksh, incluída nos dispositivos Android, desde a versão 4.2, vem acompanhada de uma série de utilitários interessantes.
O seu smartphone tem possibilidades que você mal desconfia.

Quando estiver sem Internet e sem nada pra fazer e apenas com o seu smartphone na mão, brincar na shell CLI (Command Line Interface, ou “Interface da Linha de Comando”) pode ser uma alternativa.

Sei que a grande maioria das pessoas, não vai achar este tipo de coisa interessante… mas, enfim, eu nunca fiz parte desta “grande maioria” e adoro descobrir coisas novas no terminal.
Antes de continuar, certifique-se de ter instalado um emulador de terminal em seu smartphone ou tablet.
Feito isso, vamos conhecer o comando cal.

Como obter informações sobre datas e calendários no Android com o comando cal

Já adivinhou que “cal” é abreviatura de calendar ou “calendário”?
É um utilitário tradicional do mundo UNIX/Linux.


cal

     Junho 2017       
do se te qu qu se sá  
             1  2  3  
 4  5  6  7  8  9 10  
11 12 13 14 15 16 17  
18 19 20 21 22 23 24  
25 26 27 28 29 30  

No Linux, o utilitário vai destacar o dia atual, do mês — o que não ocorreu na CLI do meu celular (Android 7 Nougat).
linux shell cal command
Você pode obter o calendário de um determinado mês e ano, com o seguinte comando:


cal 8 2019

Em que o primeiro parâmetro é o número do mês do ano e o segundo o ano.
calendar 8 August 2019
Desta forma, sempre que precisar saber em que dia da semana cai um determinado dia do ano ou do mês, você pode usar este método autenticamente geek para descobrir.

10 dicas para personalizar o prompt do seu terminal

Quem usa o terminal com frequência pode ver grande utilidade na exibição de determinadas informações na linha de comando, na parte que vem antes do cursor.
A personalização pode ser uma brincadeira muito divertida para usuários comuns — mas os administradores, que precisam acessar servidores diferentes podem se beneficiar com command line prompts diferenciados (o que ajuda a saber exatamente em que servidor e diretório você está executando algum comando).
Na série de artigos Como personalizar o prompt da linha de comando no UNIX/Linux, abordei várias formas de configurar:

  • parte 1  — ajustes básicos do prompt
  • parte 2  — como adicionar informações do sistema ao prompt e tornar as mudanças definitivas
  • parte 3  — como colorir o prompt de comando
  • parte 4  — como passar informações do prompt para a barra de títulos do seu terminal

Se você tiver dúvidas, sugiro a leitura dos textos acima. Assim evitamos redundâncias neste artigo e que ele fique mais longo do que o necessário. 😉

Em outras palavras, este post assume que você já detém o conhecimento do que foi discutido naqueles artigos, de forma que possamos ser bem mais objetivos aqui.

Se você acompanhar as tags emulador de terminal e bash vai encontrar outros textos interessantes relacionados a este assunto também.

Exemplos de prompt que você pode experimentar agora

Os exemplos, que seguem, podem ser experimentados de imediato. Basta copiar e colar no seu terminal Linux, Unix ou mesmo no Bash do Windows (eu não testei isso).
Sinta-se encorajada(o) a modificá-los para atender melhor às suas necessidades. Se quiser compartilhar alguma dica de uso, fique á vontade para postar nos comentários.
Como primeiro exemplo, veja este prompt que exibe um smiley sorrindo para comandos normais e um triste para quando você digitar um comando errado:

PS1="\t \w \`if [ \$? = 0 ]; then echo \:\); else echo \:\(; fi\` " 

experimente digitar comandos errados, para ver a mudança no “humor” do smiley.
O código abaixo, exibe uma carinha um pouco diferente para cada tipo de “humor”:

PS1="\`if [ \$? = 0 ]; then echo \\\^\\\_\\\^; else echo \\\-\\\_\\\-; fi\`*\u \w:\h)"

Uma variação deste prompt, exibe um smiley mais simples:

PS1="\t \w \`if [ \$? = 0 ]; then echo \:\); else echo \:\(; fi\` " 

Os próximos exemplos usam smileys coloridos:

PS1="\[\e[01;32m\]\u@\h \[\e[01;34m\]\W \`if [ \$? = 0 ]; then echo -e '\e[01;32m:)'; else echo -e '\e[01;31m:('; fi\` \[\e[01;34m\]$\[\e[00m\]"

A configuração abaixo acrescenta o número do comando no histórico, no começo da linha.

PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\`[\u@\h:\w]\\$ "

Se quiser saber mais sobre as cores e seus códigos, clique aqui.
Prompts em múltiplas linhas, podem conter uma quantidade maior de informações. Por outro lado, alguns usuários acham que isto polui o visual do terminal, que deveria ser um pouco mais espartano.
exemplo de prompt de comando
Se você não se importa com uma ou duas linhas a mais no prompt, mas prefere obter algumas informações imediatas, o exemplo que segue exibe o número de arquivos presentes no diretório atual e o espaço ocupado por eles.

PS1="\n\[\033[35m\]\$(/bin/date)\n\[\033[32m\]\w\n\[\033[1;31m\]\u@\h: \[\033[1;34m\]\$(/usr/bin/tty | /bin/sed -e 's:/dev/::'): \[\033[1;36m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files \[\033[1;33m\]\$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\033[0m\] -> \[\033[0m\]"

Ao contrário do anterior, este é simples (espartano), só que usa cores. Você pode usá-lo, como base, para criar algo mais sofisticado.

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Segue uma versão minimalista em 2 linhas:

PS1="[\[\033[32m\]\w]\[\033[0m\]\n\[\033[1;36m\]\u\[\033[1;33m\]-> \[\033[0m\]"

Gosto muito desta versão, abaixo, com informações sobre o diretório atual e sem excesso de cores:

PS1="\n\[\e[30;1m\]\[\016\]l\[\017\(\[\e[34;1m\]\u@\h\[\e[30;1m\])-(\[\e[34;1m\]\@ \d\[\e[30;1m\])->\[\e[30;1m\]\n\[\016\]m\[\017\]-(\[\[\e[32;1m\]\w\[\e[30;1m\])-(\[\e[32;1m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files, \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\e[30;1m\])--> \[\e[0m\]"

Atualmente, gosto do meu assim:

PS1="\n\[\e[34;1m\]\u@\h\[\e[30;1m\] \[\e[34;1m\][ \d, \@]\[\e[30;1m\]\n\[\e[30;1m\]kernel: \$(/bin/uname -r)\n\[\e[32;1m\]\w\[\e[30;1m\] (\[\e[34;1m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') arquivos, \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\e[30;1m\])--> \[\e[0m\]"

Referências

https://slashdot.org/comments.pl?sid=108424&cid=9219400.
https://www.maketecheasier.com/8-useful-and-interesting-bash-prompts/.

Como personalizar o prompt da linha de comando no UNIX/Linux — parte 4

A personalização do prompt da linha de comando pode ir além de todas aquelas as informações sobre o sistema antes do cursor.
Se você prefere ter menos “coisas” no prompt, mas não quer abrir mão de algumas informações, saiba que é possível enviar alguns destes itens para a barra de títulos do console.
Tudo o que você precisa é acrescentar um pouquinho de código ao que você já tem no seu PS1 — como foi abordado na parte 1, parte 2 e parte 3 desta série de artigos.
O pedaço de código a mais segue aí, embaixo:

"\e]2;texto para a barra de titulo\a"

Basta substituir a cadeia “texto para a barra de titulo” pelo que você achar melhor.
O código para inserir data e hora na barra de título segue abaixo:

\e]2;\d, \t - \u@\h\a

Para ter efeito imediato, acrescente este código ao valor do seu PS1, conforme destacado, abaixo:

PS1='\e]2;\d, \t - \u@\h\a \[\e[0;33m\][\T]\n\[\e[1;36m\] \w > \[\e[0;32m\]'

data hora barra de título

Obviamente, o recurso nem sempre vai funcionar. Quando você estiver usando uma interface 100% caractere (CLI), conectado remotamente a um sistema headless ou, simplesmente, usando o terminal em tela cheia (F11), por exemplo.
Nestes casos, não será possível ver qualquer barra de títulos.