Comandos auxiliares
Fora do shell podemos usar comandos muito poderosos como grep, sed, tr, mail, expr, bc e outros
Comandos auxiliares são comandos que não pertencem ao
shell, mas são praticamente encontrados em quase todas as
distribuições. Nesta edição vamos conhecer
alguns comandos auxiliares que podem nos ajudar muito no dia-dia.
O grep pesquisa nos arquivos de entrada ou na entrada-padrão
as linhas que contenham as expressões solicitadas. Exemplo:
# grep edison /etc/passwd
edison:x:500:500:Edison Figueira Junior:/home
/edison:/bin/bash
O comando acima leu o arquivo /etc/passwd linha por linha e quando
a expressão edison foi encontrada, ela foi impressa no stdout
(tela). Vamos supor que queremos listar todos os usuários do
/etc/passwd que iniciam com o caractere g. Com o caractere ^ no
começo da expressão isso é possível:
# grep ^g /etc/passwd
games:x:12:100:games:/usr/games:
gopher:x:13:30:gopher:/usr/lib/gopher-data:
Se quisermos listar todas as linhas que terminem com e temos de
acrescentar o caractere $ no final da expressão.
# grep e$ /etc/passwd
named:x:16:234:Domain name server:/tmp:/bin/false
xfs:x:17:17:X Font Server:/etc/X11/fs:/bin/false
lili:x:501:231:Eliane Cristina:/home/lili:/bin/false
Podemos também obter a saída do resultado inverso da
pesquisa. Exemplo: se você quiser todas as linhas que não
terminem com bash, escreva assim:
# grep -v bash$ /etc/passwd
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:
news:x:9:13:news:/var/spool/news:
uucp:x:10:14:uucp:/var/spool/uucp:
E é claro que podemos utilizar um grep dentro de outro
através de pipes.
# grep -v bash$ /etc/passwd | grep -v spool
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
O sed é um comando que serve para alterar uma stream de um
arquivo ou de sua entrada-padrão (STDIN). Exemplo:
# echo "seja livre use linux" |sed -e s/linux/LINUX/ seja livre use LINUX
Esse comando procurou a expressão linux e a trocou para LINUX.
Agora vamos ver um exemplo bem mais útil, imagine que
você precise enviar um e-mail personalizado para cada
usuário agradecendo o seu empenho em um determinado projeto.
Com o comando sed isso é bem fácil, precisamos editar o
texto e no lugar do nome do usuário devemos colocar um marcador
para cada substituição. Exemplo: edite um texto
agradece.txt com o seguinte conteúdo:
Sr(a) USUARIO,
A Linux Corporation agradece o empenho oferecido ao projeto Software Livre.
Saiba que todos nós ganhamos com seu apoio...
Linus Torvalds
Depois que o texto estiver pronto, você poderá executar o seguinte comando:
# for usuario in cat /etc/passwd |awk -F":" {print $1}; do sed -e s/USUARIO/$usuario/ agradece.txt| mail -s "Agradecimento" $usuario ;done
O marcador "USUARIO" será substituído pelo
login de cada usuário e o resultado retornado pelo sed
será conectado ao STDIN do mail. Esse exemplo funciona como uma
mala-direta, mais adiante vamos utilizar o sed em scripts.
Para ver o resultado sem enviar o e-mail retire o comando mail e
desvie a saída para um arquivo txt. Exemplo:
# for usuario in cat /etc/passwd |awk -F":" {print $1}; do sed -e s/USUARIO/$usuario/ agradece.txt >$usuario.txt ;done
Vamos agora conhecer e praticar o uso do comando tr. Ele serve para
alterar ou deletar caracteres de uma string. Exemplo:
# echo "seja livre use linux" | tr a-z A-Z SEJA LIVRE USE LINUX
Um bom exemplo do tr pode ser a conversão de nomes de
arquivos de minúsculas para maiúsculas ou vice-versa.
[~/exemplo #]ls
aaa bbb ccc
# for arquivo in * ; do OLD=$arquivo ; NEW=echo $OLD |tr a-z A-Z; mv -f $OLD $NEW 2>/dev/null; done
[~/exemplo #]ls
AAA BBB CCC
Poderíamos ter substituído apenas um caractere, mas
eu quis trocar todos para mostrar que podemos usar um range de
caracteres, mas um range de dígitos também é
aceito. Exemplo: 0-9.
O shell não possui internamente nenhuma função
aritmética, para isso utilizamos os comandos auxiliares bc e
expr. Se você precisa fazer cálculos de inteiros, pode
utilizar o comando expr, mas se seu cálculo possui ponto
flutuante, é necessário usar o bc. O awk também
pode fazer cálculos, porém ele é um pouco pesado
para ser utilizado somente nisso. Vamos ver alguns exemplos:
# expr 1 + 3
4
# expr 1+3
1+3
Note que para realizar cálculos com expr você precisa
deixar um espaço em branco entre o operador e os algarismos.
# expr 5 * 2
expr:syntax error
# expr 5 \* 2
10
Observe que para realizar operações de
multiplicação, temos de colocar uma barra invertida
antes do operador *. Os operadores válidos para expr
são:
* multiplicação
/ divisão
% módulo
+ adição
- subtração
Para atribuir valores às variáveis utilize os
caracteres de substituição de parâmetros.
# VALOR=expr 10 \* 2
# echo $VALOR
20
O bc calcula uma expressão através do STDIN. Exemplo:
# echo "13 / 2" |bc
6
Observe que o resultado foi inteiro (6). Para obter resultados com
ponto flutuante, é preciso setar a escala de ponto decimal.
Essa escala representa a quantidade de dígitos que queremos
depois do ponto. Exemplo:
# echo "scale=2; 13 / 2" |bc
6.50
Também podemos atribuir os valores retornados para uma
variável através de substituição de
parâmetros.
# VALOR=echo "scale=2; 13 / 2" |bc
echo $VALOR
6.50
Até a próxima edição.