Search
Archives

You are currently browsing the archives for the Bash e Shell category.

Bookmarks

Archive for the ‘Bash e Shell’ Category

256 cores no shell

Quem leu os posts [Deixando o prompt colorido] e [Usando cores e efeitos no shell] gostou da idéia de colorir os caracteres do shell e o prompt com 16 cores.

Porém, é possível que o seu shell tenha 256 cores, sendo as 16 que já vimos até então (do padrão ANSII) e mais 240 novas.

Para explicar novamente o que expliquei em [Usando cores e efeitos no shell], é mais cômodo você ler o artigo que citei antes, pois o uso das 256 cores é mais complexo (sem saber o básico, você terá dificuldades de compreender), e depois volte a partir daqui para continuar de onde parou :D

Vamos aos exemplos agora.

Para imprimirmos o nome “Alice” apenas em violeta, ou seja,  Alice 

echo -e "\033[0;38;5;129m Alice \033[0m"

"Alice" com fundo verde-limão e texto em negrito:  Alice 

echo -e "\033[1;48;5;118m Alice \033[0m"

Para entender melhor:
echo -e "\033[1;48;5;118m Alice \033[0m"

O número 1 é o código do negrito. Se ele for 0, não é negrito. Os demais efeitos estão em [Usando cores e efeitos no shell].

O número 48 é para que a cor seja especificada como plano de fundo. Se for 38 a cor é especificada para o texto.

Não sei qual é a finalidade desse número 5, mas ele deve estar ali. Se for omitido ou colocar outro número no lugar, não vai funcionar.

O número 118 é o código da cor verde-limão. O código do violeta é 129. A tabela completa com todos os códigos de cores está no final desse artigo.

E é possível combinar as cores de textos e de plano de fundo também.

"Alice" com texto em violeta com fundo verde-limão sem efeitos, ou seja,  Alice 

Vamos printar o código do texto violeta primeiro (\033[0;38;5;129m) e depois o código do plano de fundo verde-limão (\033[0;48;5;118m):

echo -e "\033[0;38;5;129m\033[0;48;5;118m Alice \033[0m"

"Alice" com texto em violeta e negrito com fundo verde-limão, ou seja,  Alice 

Vamos printar o código do texto violeta primeiro (\033[0;38;5;129m) e depois o código do plano de fundo verde-limão com o código de negrito junto (\033[1;48;5;118m).

echo -e "\033[0;38;5;129m\033[1;48;5;118m Alice \033[0m"

Nada impede também de você querer printar primeiro o código do plano de fundo e depois o código do texto, porque o resultado final será o mesmo, independente da ordem, porém o código do efeito deve ser especificado na última tag, do contrário, não vai sair o efeito negrito (ou qualquer outro), porque você vai acabar ativando o negrito com 1 na primeira tag, mas já o desativa logo em seguida com o 0 na segunda tag.

A seguir está a tabela completa de todas as cores:

Quem usa o terminal do Mac vai se decepcionar, porque este terminal não suporta 256 cores, os demais sim, porém quem usa o Mac pode ter esperanças nos terminais alternativos, como o Zoc, o Terminator ou o iTerm. O terminal nativo do X que é utilizado pelo Mac e pelo Linux suporta todas essas cores.

Para saber quais são os efeitos e quais programas o suportam, veja [Usando cores e efeitos no shell].

Salvando o resultado de um comando (sem erros e com erros juntos e separados) em arquivos.

Supondo que queiramos salvar em arquivo o resultado de “ls -l um_diretório”:

Salvando sem nenhuma mensagem de erro:

ls -l um_diretorio > resultado.txt

Você não verá nada na tela a não ser erros (se houverem, nesse caso, diretório não encontrado ou problema de permissão nele), pois tudo o que o comando acima deveria exibir na tela será salvo no arquivo “resultado.txt”.

Salvando os erros (se houverem) no mesmo arquivo:

ls -l um_diretorio > resultado.txt 2>&1

Nada será mostrado na tela, nem os erros, porque o argumento 2>&1 converte mensagens de erros em saídas normais e depois salva todo o resultado no arquivo “resultado.txt”.

Salvando os erros (se houverem) em um arquivo separado:

ls -l um_diretorio > resultado.txt 2>erros.txt

Salva o resultado do comando (sem erros) no arquivo “resultado.txt” e salva os erros no arquivo “erros.txt”. Comandos como o “find” podem retornar saídas normais e erros durante a sua execução, então esse exemplo te ajuda a filtrar todas as saídas válidas e os erros retornados por esse comando.

Deixando o prompt colorido

A distribuição Gentoo possui um prompt colorido ao acessar o shell, veja aqui como deixá-lo para a sua distribuição também.

Abra o arquivo .bashrc (faça um backup dele antes ok?) que está no seu diretório home de usuário (geralmente /home/seunome ou /root se você estiver como root).

Vá ao final do arquivo e, conforme a tabela que está no tópico [Usando cores e efeitos no shell] você pode escolher as cores para seu prompt definindo-as na variável PS1 e PS2.

A variável PS1 é a que mostra o texto no seu prompt, como:

jose@jose-desktop:~$ _

E a variável PS2 é aquele “>” que aparece quando você digita um comando com mais de uma linha, por exemplo:

jose@jose-desktop:~$ echo "
 > Ola"

Geralmente a variável PS1 tem o seguinte conteúdo:

PS1="\u@\h:\w\$ "

onde:
\u Exibe o nome do usuário (username)
\h Exibe o nome da máquina (hostname)
\w Exibe o caminho atual

E a PS2 é simplesmente:

PS2=" > "

Para apenas o nome do seu usuário aparecer em vermelho, conforme o exemplo da tabela de código de cores [aqui], definiremos por exemplo:

PS1="\033[31m\u\033[0m@\h:\w\$ "

Resultado final:
jose@jose-desktop:~$

Se quiser algo como:
jose@jose-desktop:~$

em uma linha só ficará grande, então você pode fazer dessa forma:

PS1="\033[35m\u"
PS1="$PS1\033[34m@"
PS1="$PS1\033[36m\h"
PS1="$PS1\033[32m:"
PS1="$PS1\033[33m\w"
PS1="$PS1\033[31m\$\033[0m "

Teste antes abrindo um terminal novo para ver se está tudo ok, do contrário, restaure o backup do .bashrc

Outra forma mais rápida de ele atualizar o seu prompt após essa edição é rodar o comando

source .bashrc

Detalhe importante para quem usa distribuições baseadas no Red Hat, como o próprio Red Hat, CentOS, Mandriva e Fedora, O arquivo “.bashrc” em alguns casos é o “.bash_profile”, então substitua todos os exemplos com .bashrc por .bash_profile

O que acha de editar a variável PS2 para deixá-la algo como o exemplo abaixo?

jose@jose-desktop:~$ for x in {1..7}
>>>>>> do
>>>>>> echo $x
>>>>>> done

Divirtam-se :-)

Usando cores e efeitos no shell

É possível lidarmos com cores no shell e com efeitos também.

As cores comuns já estão padronizadas e alguns dos efeitos também, porém as cores brilhantes e alguns dos efeitos ainda estão passando por esse processo.

Na tabela abaixo os resultados foram testadas nos seguinte softwares:

- Terminal do Mac OS X
- Terminal do Gnome (gnome-terminal);
- Terminal do KDE (konsole);
- Shell nativo do Unix (quando nenhuma interface gráfica está carregada);
- PuTTY (conectado por SSH a partir de um computador com Windows);

[m] mac terminal – [g] gnome-terminal – [k] konsole – [n] native unix shell – [x] native X shell – [p] putty

Efeitos Cor dos caracteres Cor de fundo
0 Voltar tudo ao normal
m [OK] – g [OK] – k [OK] – n [OK] – x[OK] – p [OK]
 30 Preto  40 Preto
1 Negrito (com cor brilhante)
m [OK] – g [OK] – k [OK] – n [OK] – x [OK] – p [--]
 31 Vermelho  41 Vermelho
2 Escuro
m [--] – g [OK] – k [--] – n [OK] – x [--] – p [--]
 32 Verde  42 Verde
3 (indefinido)
m [--] – g [--] – k [--] – n [--] – p [--]
 33 Amarelo  43 Amarelo
4 Sublinhado
m [--] – g [OK] – k [OK] – n [--] – p [OK]
 34 Azul  44 Azul
5 Pisca
m [OK] – g [--] – k [OK] – n [OK] – p [--]
 35 Magenta  45 Magenta
6 (indefinido)
m [--] – g [--] – k [--] – n [--] – p [--]
 36 Ciano  46 Ciano
7 Invertido
m [OK] – g [OK] – k [OK] – n [OK] – p [OK]
 37 Branco  47 Branco
8 Invisível
m [OK] – g [OK] – k [--] – n [--] – p [--]
 90 Preto Brilhante 100 Preto Brilhante
9 Tachado
m [--] – g [OK] – k [--] – n [--] – p [--]
 91 Vermelho Brilhante 101 Vermelho Brilhante
   
 
 92 Verde Brilhante 102 Verde Brilhante
   
 
 93 Amarelo Brilhante 103 Amarelo Brilhante
   
 
 94 Azul Brilhante 104 Azul Brilhante
   
 
 95 Magenta Brilhante 105 Magenta Brilhante
   
 
 96 Ciano Brilhante 106 Criano Brilhante
   
 
 97 Branco Brilhante 107 Branco Brilhante

Exemplos:

Para imprimirmos o nome “Alice” apenas em verde, ou seja,  Alice 

echo -e "\033[32m Alice \033[0m"

Dá para fazer combinações de um ou mais efeitos com cores, e de cores com cores também.

"Alice" com fundo vermelho brilhante e texto em negrito:  Alice 

echo -e "\033[101;1m Alice \033[0m"

"Alice" com fundo Ciano Brilhante e texto Azul:  Alice 

echo -e "\033[106;34m Alice \033[0m"

"Alice" com fundo Verde, texto Amarelo, sublinhado e negrito:  Alice 

echo -e "\033[33;42;4;1m Alice \033[0m"

Mas por que tenho sempre que finalizar com "\033[0m" ?
Porque ele reseta (retira) a configuração de cores. Se essa sequencia não for colocada, todo o seu shell terá a cor e/ou o efeito aplicados até então.

É possível também [deixar o prompt do seu shell colorido] com estas mesmas informações.

Selecionando colunas com o cut

O cut tem a sintaxe mais simplificada que o awk mas nem sempre tem a mesma precisão.

Para mostrar somente a primeira coluna do comando “ls -l”, rode:

ls -l | cut -f 1 -d " "

Mas e esse “-d”? Esse é o parâmetro do delimitador. No exemplo acima informamos ao cut que o delimitador deve ser o caractere espaço. Se quisermos mostrar tudo o que o “ls -l” mostra após o caractere de dois-pontos :, ou seja, a segunda coluna, então o comando é:

ls -l | cut -f 2 -d ":"

E se quiser usar o cut para mostrar uma coluna a partir de um arquivo, então usamos, por exemplo:

cut -f 1 -d " " arquivo.txt

Para maiores dúvidas sobre o cut:

cut --help
# ou
man cut

Contador de linhas, palavras e bytes em Unix com o comando wc

O comando wc é muito útil para fazer esse tipo de contagem, tanto em arquivo quanto em retorno de comandos.

wc arquivo.txt

Ele retornará três resultados: total de linhas, total de palavras e o total de bytes.

Você também pode saber a quantidade de linhas, palavras e bytes que um comando retorna, por exemplo:

ls -l | wc

É possível ser mais específico também. Se quiser saber só o total de linhas, então use:

wc -l arquivo.txt
# ou
qualquer comando | wc -l

Para saber mais sobre o comando wc:

wc --help
# ou então
man wc

Selecionando colunas com o awk

A sintaxe do awk é mais complexa que a do cut, mas ele tem precisão maior na seleção das colunas e ainda pode mostrar mais de uma conforme você desejar.

Se em casos, como o do comando “ls -l”, você quiser ver somente as permissões dos arquivos, as permissões estão na primeira coluna, então o comando que rodaremos é:

ls -l | awk '{print $1}'

Mas e se quisermos também exibir o tamanho dos arquivos que estão na quinta coluna? Usaremos nesse caso:

ls -l | awk '{print $1 $5}'

Dessa forma não vai ficar estético ;-), então por quê não deixarmos mais organizado?

ls -l | awk '{print "permissao: "$1", tamanho: "$5}'

O awk também pode selecionar colunas em um arquivo usando a mesma regra:

awk '{print $2}' arquivo.txt

Como perceberam, os delimitadores são os espaços e os tabs. Mas e se eu quiser, por exemplo, delimitar um .csv, que são tudo separados por ponto-e-vírgula “;”?

awk -F";" '{print $1}' arquivo.csv
# altera o delimitador para ; e mostra somente a primeira coluna (a $1)

O delimitador também pode ser dois ou mais caracteres em sequencia, por exemplo, “!@”, então o comando será:

awk -F"!@" '{print $3}' arquivoesquisito.txt
# altera o delimitador para !@ e mostra somente a terceira coluna (a $3)

Para saber mais sobre o awk:

awk --help
# ou então
man awk

Classificação, ordenação e eliminação de palavras repetidas usando sort

Para conhecermos melhor o sort, vamos supor que o comando “ls -l” retorne os seguintes resultados:

-rw-r--r--  1 glauco glauco 4556164485 2009-08-13 20:50 brasero.iso.bz2
-rwxr-xr-x  1 glauco glauco        609 2009-06-13 20:15 coresgeratudo.php
-rw-r--r--  1 glauco glauco     443788 2009-04-18 21:47 rpcrt4.dll.tar.gz
-rw-r--r--  1 glauco glauco     473422 2009-06-28 17:22 SnowCoberta.jpg

Perceba que a quinta coluna é o tamanho do arquivo em Bytes. Se quisermos ordenar de forma crescente o resultado do comando por tamanho, então usaremos:

ls -l | sort -k5n

# O resultado será:

-rwxr-xr-x  1 glauco glauco        609 2009-06-13 20:15 coresgeratudo.php
-rw-r--r--  1 glauco glauco     443788 2009-04-18 21:47 rpcrt4.dll.tar.gz
-rw-r--r--  1 glauco glauco     473422 2009-06-28 17:22 SnowCoberta.jpg
-rw-r--r--  1 glauco glauco 4556164485 2009-08-13 20:50 brasero.iso.bz2

E se quisermos ordenar na ordem decrescente, usaremos:

ls -l | sort -k5nr

# O resultado será

-rw-r--r--  1 glauco glauco 4556164485 2009-08-13 20:50 brasero.iso.bz2
-rw-r--r--  1 glauco glauco     473422 2009-06-28 17:22 SnowCoberta.jpg
-rw-r--r--  1 glauco glauco     443788 2009-04-18 21:47 rpcrt4.dll.tar.gz
-rwxr-xr-x  1 glauco glauco        609 2009-06-13 20:15 coresgeratudo.php

O parâmetro -n informa ao sort que você está classificando números e o -r faz a classificação na ordem inversa. Nesse exemplo usamos o -n pois sabemos que o tamanho dos arquivos são números. Se não colocássemos o -n o sort pensaria que você estaria tentando classificar um texto, veja:

ls -l | sort -k5

# Retornará

-rw-r--r--  1 glauco glauco     443788 2009-04-18 21:47 rpcrt4.dll.tar.gz
-rw-r--r--  1 glauco glauco 4556164485 2009-08-13 20:50 brasero.iso.bz2
-rw-r--r--  1 glauco glauco     473422 2009-06-28 17:22 SnowCoberta.jpg
-rwxr-xr-x  1 glauco glauco        609 2009-06-13 20:15 coresgeratudo.php

Você também pode fazer a mesma coisa com arquivos

sort arquivo.txt

Para eliminar as repetições você pode usar:

sort -u arquivo.txt

Para saber mais sobre o sort é só rodar:

sort --help

Filtragem de dados com o comando grep

Supondo que um comando que você esteja rodando retorna muitas informações e você só queira ver as linhas que contenham Maria:

qualquer comando | grep 'Maria'

Mas se você quiser ver tudo, exceto Maria, o comando é:

qualquer comando | grep -v 'Maria'

E se quiser ver somente as linhas que contenham somente Maria ou somente Jose:

qualquer comando | grep -P 'Maria|Jose'

Se quiser ver tudo exceto Maria e Jose:

qualquer comando | grep -vP 'Maria|Jose'

O grep também pode ser usado para procurar textos nos aquivos usando a mesma lógica acima, por exemplo:

Procurar por Joao em um arquivo:

grep 'Joao' arquivo.txt

Procurar por Joao nos arquivos .txt do diretório atual:

grep 'Joao' *.txt

Procurar por Joao de forma recursiva em todos os arquivos e sub-diretórios:

grep -r 'Joao' .

* esse ponto no final do comando significa que é o diretório atual, se quiser procurar em outro diretório, então ficará:

grep -r 'Joao' /home/SeuNome/diretorio_a_procurar

Se quiser somente saber quais os arquivos possuem a palavra Joao, mas não te inteessar ver quais as linhas, então rode:

grep -rl 'Joao' .

* Lembre-se que o ponto no final do comando significa que a procura será feita a partir d diretório que você estiver posicionado.

Para saber mais sobre o grep é só rodar:

grep --help

Apagando linhas com o comando sed

Supondo que você queira apagar todas as linhas que contenham Joao, o comando é:

Modo preview (só mostra a mudança na tela, mas não salva o arquivo):

sed '/Joao/d' arquivo.txt

Modo edição (não mostra nada na tela, mas salva as alterações no arquivo):

sed -i '/Joao/d' arquivo.txt

Modo edição com backup (altera e deixa um backup do arquivo original):

sed -i.bak '/Joao/d' arquivo.txt

* Esse comando deixa o arquivo original salvo como arquivo.txt.bak e aplica a mudança no arquivo.txt

Modo captura de saída de outro comando:

comando qualquer | sed '/Joao/d'

Veja também como substituir dados com o comando sed e com o vim.