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 |
| 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 |
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.
