Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Aplicação de comandos grep, fgrep e egrep no Linux, Notas de estudo de Informática

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

2011

Compartilhado em 10/03/2011

william-felipe-dutra-abreu-da-silva
william-felipe-dutra-abreu-da-silva 🇧🇷

21 documentos

1 / 4

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
LINUX USERPapo de Botequim
87Setembro 2004
www.linuxmagazine.com.br
$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,
ocomando 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”.
Ogrep é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 efgrep.Aprinci-
pais diferenças entre os 3 são:
grep -Pode ou não usar expressões
regulares simples, porém no caso de
não usá-las, o fgrep émelhor, por ser
mais rápido.
egrep (“e” de extended,estendido) - É
muito poderoso no uso de expressões
regulares. Por ser o mais poderoso dos
três, só deve ser usado quando for
necessária a elaboração de uma
expressão regular não aceita pelo grep.
fgrep (“f” de fast,rápido) - Como o
nome diz, é o ligeirinho da família,
executando o serviço de forma muito
veloz (por vezes é cerca de 30% mais
rápido que o grep e50% mais que o
egrep), porém não permite o uso de
expressões regulares na pesquisa.
–Agora que você já conhece as difer-
enças entre os membros da família, me
diga: o que você acha dos três exemplos
que eu dei antes das explicações?
Achei que o fgrep resolveria o teu prob-
lema mais rapidamente que o grep.
Perfeito! Tô vendo que você está
atento, entendendo tudo que estou te
explicando! Vamos ver mais exemplos
Garç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!
E então, amigo, tá entendendo
tudo que te expliquei até agora?
Entendendo eu tô, mas não vi
nada prático nisso…
Calma rapaz, o que te falei até
agora serve como base ao que há
de vir daqui pra frente. Vamos usar
essas ferramentas que vimos para
montar programas estruturados. Você
verá porque até na TV já teve pro-
grama chamado “O Shell é o Limite”.
Para começar vamos falar dos coman-
dos da família grep
Grep? Não conheço nenhum termo em
inglês com este nome…
É claro, grep é um acrônimo (sigla)
para Global Regular Expression Print,
que usa expressões regulares para
pesquisar a ocorrência de cadeias de
caracteres na entrada definida.
Por falar em expressões regulares (ou
regexp), o Aurélio Marinho Jargas es-
creveu dois artigos [1 e 2] imperdíveis
para a Revista do Linux sobre esse
assunto e também publicou um livro [3]
pela Editora Novatec. Acho bom você ler
esses artigos, eles vão te ajudar no que
está para vir.
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:
Nossos personagens voltam à mesa do bar para discutir expressões regulares e
colocar a “mão na massa”pela primeira vez, construindo um aplicativo simples
para catalogar uma coleção de CDs.
POR JÚLIO CÉSAR NEVES
Curso de Shell Script
Papo de Botequim - Parte II
pf3
pf4

Pré-visualização parcial do texto

Baixe Aplicação de comandos grep, fgrep e egrep no Linux e outras Notas de estudo em PDF para Informática, somente na Docsity!

Papo de Botequim LINUX USER

www.linuxmagazine.com.br Setembro 2004 87

$ 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:

  • grep - Pode ou não usar expressões regulares simples, porém no caso de não usá-las, o fgrep é melhor, por ser mais rápido.
  • egrep (“e” de extended , estendido) - É muito poderoso no uso de expressões regulares. Por ser o mais poderoso dos três, só deve ser usado quando for necessária a elaboração de uma expressão regular não aceita pelo grep.
  • fgrep (“f” de fast , rápido) - Como o nome diz, é o ligeirinho da família, executando o serviço de forma muito veloz (por vezes é cerca de 30% mais rápido que o grep e 50% mais que o egrep ), porém não permite o uso de expressões regulares na pesquisa. –Agora que você já conhece as difer- enças entre os membros da família, me diga: o que você acha dos três exemplos que eu dei antes das explicações?
  • Achei que o fgrep resolveria o teu prob- lema mais rapidamente que o grep.
  • Perfeito! Tô vendo que você está atento, entendendo tudo que estou te explicando! Vamos ver mais exemplos

G

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!

  • E então, amigo, tá entendendo tudo que te expliquei até agora?
  • Entendendo eu tô, mas não vi nada prático nisso…
  • Calma rapaz, o que te falei até agora serve como base ao que há de vir daqui pra frente. Vamos usar essas ferramentas que vimos para montar programas estruturados. Você verá porque até na TV já teve pro- grama chamado “O Shell é o Limite”. Para começar vamos falar dos coman- dos da família grep
  • Grep? Não conheço nenhum termo em inglês com este nome…
  • É claro, grep é um acrônimo (sigla) para Global Regular Expression Print , que usa expressões regulares para pesquisar a ocorrência de cadeias de caracteres na entrada definida. Por falar em expressões regulares (ou regexp ), o Aurélio Marinho Jargas es- creveu dois artigos [1 e 2] imperdíveis para a Revista do Linux sobre esse assunto e também publicou um livro [3] pela Editora Novatec. Acho bom você ler esses artigos, eles vão te ajudar no que está para vir.

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:

Nossos personagens voltam à mesa do bar para discutir expressões regulares e

colocar a “mão na massa” pela primeira vez, construindo um aplicativo simples

para catalogar uma coleção de CDs. POR JÚLIO CÉSAR NEVES

Curso de Shell Script

Papo de Botequim - Parte II

LINUX USER Papo de Botequim

88 Setembro 2004 www.linuxmagazine.com.br

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

  • Péra aí! De onde eu vou receber os dados dos CDs?
  • Vou mostrar como o programa pode receber parâmetros de quem o estiver executando e, em breve, ensinarei a ler os dados da tela ou de um arquivo.

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

LINUX USER Papo de Botequim

90 Setembro 2004 www.linuxmagazine.com.br

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

Consulta CDs (versao 1)

grep $1 musicas

Listagem 3 - muslist

$ cat muslist #!/bin/bash

Consulta CDs (versao 2)

grep -i “$1” musicas

Listagem 4 muslist melhorado

$ cat musexc #!/bin/bash

Exclui CDs (versao 1)

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