


Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Este documento aborda os comandos grep, fgrep e egrep no sistema operacional linux, demonstrando sua utilização para pesquisar padrões em arquivos de texto e na saída de outros comandos. Além disso, é apresentado um exemplo de aplicação para catalogar uma coleção de cds.
Tipologia: Notas de estudo
1 / 4
Esta página não é visível na pré-visualização
Não perca as partes importantes!



$ grep franklin /etc/passwd
Pesquisando em vários arquivos:
$ grep grep *.sh
Pesquisando na saída de um comando:
$ who | grep carvalho
No 1º exemplo, procurei a palavra franklin em qualquer lugar do arquivo /etc/passwd. Se quisesse procurar um nome de usuário, isto é, somente no iní- cio dos registros desse arquivo, poderia digitar $ grep ‘^franklin’ /etc/passwd. “E para que servem o circunflexo e os apóstrofos?”, você vai me perguntar. Se tivesse lido os artigos que mencionei, saberia que o circunflexo serve para limi- tar a pesquisa ao início de cada linha e os apóstrofos servem para o Shell não interpretar esse circunflexo, deixando-o passar incólume para o comando grep. No 2º exemplo mandei listar todas as
linhas que usavam a palavra grep, em todos os arquivos terminados em .sh. Como uso essa extensão para definir meus arquivos com programas em Shell, malandramente, o que fiz foi listar as lin- has dos programas que poderia usar como exemplo do comando grep. Olha que legal! O grep aceita como entrada a saída de outro comando, redi- recionado por um pipe (isso é muito comum em Shell e é um tremendo acelerador da execução de coman- dos). Dessa forma, no 3° exemplo, o comando who listou as pessoas “logadas” na mesma máquina que você (não se esqueça jamais: o Linux é multiusuário) e o grep foi usado para verificar se o Carvalho estava trabalhando ou “coçando”. O grep é um comando muito con- hecido, pois é usado com muita fre- qüência. O que muitas pessoas não sabem é que existem três comandos na família grep: grep , egrep e fgrep. A princi- pais diferenças entre os 3 são:
arçom! Traz um “chops” e dois “pastel”. O meu amigo hoje não vai beber porque está finalmente sendo apresentado a um verdadeiro sis- tema operacional, e ainda tem muita coisa a aprender!
Eu fico com grep,você com gripe
Esse negócio de gripe é brincadeira, só um pretexto para pedir umas caipirinhas. Eu te falei que o grep procura cadeias de caracteres dentro de uma entrada defi- nida, mas o que vem a ser uma “entrada definida”? Bem, existem várias formas de definir a entrada do comando grep. Veja só. Para pesquisar em um arquivo:
Curso de Shell Script
para clarear de vez as diferenças de uso entre os membros da família. Eu sei que em um arquivo qualquer existe um texto falando sobre Linux, só não tenho certeza se está escrito com L maiúsculo ou minúsculo. Posso fazer uma busca de duas formas:
egrep (Linux | linux) arquivo.txt
ou então:
grep [Ll]inux arquivo.txt
No primeiro caso, a expressão regular complexa (Linux | linux) usa os parênte- ses para agrupar as opções e a barra ver- tical ( | ) é usada como um “ou” ( or , em inglês) lógico, isto é, estou procurando Linux ou linux. No segundo, a expressão regular [Ll]inux significa: começado por L ou l seguido de inux. Como esta é uma expressão simples, o grep consegue resolvê-la, por isso é melhor usar a segunda forma, já que o egrep tornaria a pesquisa mais lenta. Outro exemplo. Para listar todos os subdiretórios do diretório corrente, basta usar o comando $ ls -l | grep ‘^d’. Veja o resultado no Quadro 1. No exemplo, o circunflexo ( ^ ) serviu para limitar a pesquisa à primeira posição da saída do ls longo (parâmetro
-l ). Os apóstrofos foram usados para o Shell não “ver” o circunflexo. Vamos ver mais um. Veja na Tabela 1 as quatro primeiras posições possíveis da saída de um ls -l em um arquivo comum (não é diretório, nem link, nem …). Para descobrir todos os arquivos exe- cutáveis em um determinado diretório eu poderia fazer:
$ ls -la | egrep ‘^-..(x|s)’
novamente usamos o circunflexo para limitar a pesquisa ao início de cada linha, ou seja, listamos as linhas que começam por um traço ( - ), seguido de qualquer coisa (o ponto), novamente seguido de qualquer coisa, e por fim um x ou um s. Obteríamos o mesmo resul- tado se usássemos o comando:
$ ls -la | grep ‘^-..[xs]’
e além disso, agilizaríamos a pesquisa.
A “CDteca” Vamos começar a desenvolver progra- mas! Creio que a montagem de um banco de dados de músicas é bacana para efeito didático (e útil nestes tempos de downloads de arquivos MP3 e queimadores de CDs). Não se esqueça que, da mesma forma que vamos desen- volver um monte de programas para organizar os seus CDs de música, com pequenas adaptações você pode fazer o mesmo para organizar os CDs de soft- ware que vêm com a Linux Magazine e outros que você compra ou queima, e disponibilizar esse banco de software para todos os que trabalham com você (o Linux é multiusuário, e como tal deve
ser explorado).
Passando parâmetros Veja abaixo a estrutura do arquivo con- tendo a lista das músicas:
nomedoálbum^intérprete1~nome U damúsica1:...:intérprete n ~nome U damúsica n
Isto é, o nome do álbum será separado por um circunflexo do resto do registro, formado por diversos grupos compostos pelo intérprete de cada música do CD e a música interpretada. Estes grupos são separados entre si por dois pontos ( : ) e, internamente, o intérprete será separado por um til ( ~ ) do nome da música. Quero escrever um programa chamado musinc , que incluirá registros no meu arquivo músicas. Passarei cada álbum como parâmetro para o programa:
$ musinc “álbum^interprete~ U musica:interprete~musica:...”
Desta forma, musinc estará recebendo os dados de cada álbum como se fosse uma variável. A única diferença entre um parâmetro recebido e uma variável é que os primeiros recebem nomes numéricos (o que quis dizer é que seus nomes são formados somente por um algarismo, isto é, $1, $2, $3, …, $9). Vamos, fazer mais alguns testes:
$ cat teste #!/bin/bash #Teste de passagem de parametros echo “1o. parm -> $1” echo “2o. parm -> $2” echo “3o. parm -> $3”
Agora vamos rodar esse programinha:
$ teste passando parametros para U testar bash: teste: cannot execute
Ops! Esqueci-me de tornar o script exe- cutável. Vou fazer isso e testar nova- mente o programa:
$ ls -l | grep ‘^d’ drwxr-xr-x 3 root root 4096 Dec 18 2000 doc drwxr-xr-x 11 root root 4096 Jul 13 18:58 freeciv drwxr-xr-x 3 root root 4096 Oct 17 2000 gimp drwxr-xr-x 3 root root 4096 Aug 8 2000 gnome drwxr-xr-x 2 root root 4096 Aug 8 2000 idl drwxrwxr-x 14 root root 4096 Jul 13 18:58 locale drwxrwxr-x 12 root root 4096 Jan 14 2000 lyx drwxrwxr-x 3 root root 4096 Jan 17 2000 pixmaps drwxr-xr-x 3 root root 4096 Jul 2 20:30 scribus drwxrwxr-x 3 root root 4096 Jan 17 2000 sounds drwxr-xr-x 3 root root 4096 Dec 18 2000 xine drwxr-xr-x 3 root root 4096 Jun 19 2000 xplns
Quadro 1 - Listando subdiretórios
Posição Valores possíveis 1ª - 2ª r ou - 3ª w ou - 4ª x, s(suid) ou -
Tabela 1
mando. Estamos então prontos para desenvolver o script para remover CDs empenados da sua “CDteca”. Veja o código da Listagem 5. Na primeira linha mandei para /tmp/mus$$ o arquivo musicas, sem os registros que atendessem a consulta feita pelo comando grep. Em seguida, movi /tmp/mus$$ por cima do antigo musicas. Usei o arquivo /tmp/mus$$ como arqui- vo de trabalho porque, como já havia citado no artigo anterior, o $$ contém o PID (identificação do processo) e, dessa forma, cada um que editar o arquivo musicas o fará em um arquivo de tra- balho diferente, evitando colisões. Os programas que fizemos até aqui ainda são muito simples, devido à falta de ferramentas que ainda temos. Mas é bom praticar os exemplos dados porque, eu prometo, chegaremos a desenvolver um sistema bacana para controle dos seus CDs. Na próxima vez que nos encontrarmos, vou te ensinar como fun- cionam os comandos condicionais e aprimoraremos mais um pouco esses scripts. Por hoje chega! Já falei demais e estou de goela seca! Garçom! Mais um sem colarinho! n
Julio Cezar Neves é Analista de Suporte de Sistemas desde 1969 e trabalha com Unix desde 1980, quando fez parte da equipe que desenvolveu o SOX, um sistema operacional similar ao Unix, produzido SOBRE O AUTOR pela Cobra Computadores.
Ficar listando arquivos com o comando cat não está com nada, vamos fazer um programa chamado muslist para listar um álbum, cujo nome será passado como parâmetro. Veja o código na Listagem 3: Vamos executá-lo, procurando pelo album 2. Como já vimos antes, para pas- sar a string album 2 é necessário pro- tegê-la da interpretação do Shell, para que ele não a interprete como dois parâmetros. Exemplo:
$ muslist “album 2” grep: can’t open 2 musicas: album1^Artista1~Musica1 U :Artista2~Musica musicas: album2^Artista3~Musica3 U :Artista4~Musica musicas:album3^Artista5~Musica5 U :Artista6~Musica
Que lambança! Onde está o erro? Eu tive o cuidado de colocar o parâmetro pas- sado entre aspas para o Shell não o dividir em dois! É, mas repare como o grep está sendo executado:
grep $1 musicas
Mesmo colocando álbum 2 entre aspas, para que fosse encarado como um único parâmetro, quando o $1 foi passado pelo Shell para o comando grep , transformou- se em dois argumentos. Dessa forma, o conteúdo da linha que o grep executou foi o seguinte:
grep album 2 musicas
Como a sintaxe do grep é:
grep U [arq1, arq2, ..., arqn]
O grep entendeu que deveria procurar a cadeia de caracteres album nos arquivos 2 e musicas. Como o arquivo 2 não existe, grep gerou o erro e, por encontrar a palavra album em todos os registros de musicas, listou a todos. É melhor ignorarmos maiúsculas e minúsculas na pesquisa. Resolveremos os dois problemas com a Listagem 4. Nesse caso, usamos a opção -i do grep que, como já vimos, serve para ignorar maiúsculas e minúsculas, e colocamos o $1 entre aspas, para que o grep continu- asse a ver a cadeia de caracteres resul- tante da expansão da linha pelo Shell como um único argumento de pesquisa.
$ muslist “album 2” album2^Artista3~Musica3:Artista4 U ~Musica
Agora repare que o grep localiza a cadeia pesquisada em qualquer lugar do registro; então, da forma que estamos fazendo, podemos pesquisar por álbum, por música, por intérprete e mais. Quando conhecermos os comandos condicionais, montaremos uma nova versão de muslist que permitirá especi- ficar por qual campo pesquisar. Ah! Em um dia de verão você foi à praia, esqueceu os CDs no carro, aquele “solzinho” de 40 graus empenou seu disco favorito e agora você precisa de uma ferramenta para removê-lo do banco de dados? Não tem problema, vamos desenvolver um script chamado musexc , para excluir estes CDs. Antes de desenvolver o “bacalho”, quero te apresentar a uma opção bas- tante útil da família de comandos grep. É a opção -v , que quando usada lista todos os registros da entrada, exceto o(s) local- izado(s) pelo comando. Exemplos:
$ grep -v “album 2” musicas album1^Artista1~Musica1:Artista2 U ~Musica album3^Artista5~Musica5:Artista6 U ~Musica
Conforme expliquei antes, o grep do exemplo listou todos os registros de musicas exceto o referente a album 2, porque atendia ao argumento do co-
$ cat muslist #!/bin/bash
grep $1 musicas
Listagem 3 - muslist
$ cat muslist #!/bin/bash
grep -i “$1” musicas
Listagem 4 muslist melhorado
$ cat musexc #!/bin/bash
grep -v “$1” musicas > /tmp/mus$$ mv -f /tmp/mus$$ musicas
Listagem 5 - musexc
[1] http://www.revistadolinux.com.br/ed/003/ ferramentas.php [2] http://www.revistadolinux.com.br/ed/007/ ereg.php [3] http://www.aurelio.net/er/livro/
INFORMAÇÕES