Revista Do Linux
EDIÇÃO DO MÊS
 CD do Mês

 Capa
 Entrevista
 Corporativo
 Editoração
 Segurança
 Hardware
 Produtos
 Programação
 Sistema
 

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.


A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux