grep - alguns exemplos de uso e linha de comando

Atualizado em: 31/08/2006



Sobre este documento

linhas de comando e scripts com uso do grep, egrep, fgrep e semelhantes na edição de arquivos textos ou dados passados pelo pipe |.

sobre o grep

O que significa grep?

Digite na caixa de pesquisa do www.google.com.br, define:grep não entendeu porque está em ingles? então use o próprio google pra traduzir a página, copie a URL atual, vá pro final da página, clique em "Ferramentas de idiomas", cole o endereço, clique em "traduzir", ou acesse diretamente o tradutor em:

http://translate.google.com/translate_t

CTRL+T abre outra aba no browser pra colar a URL que deseja traduzir.

No CL o manual está em portugues, digite no prompt:

grep, egrep, fgrep - lista as linhas que combinem com um padrão

  DESCRIÇÃO
         Grep pesquisa nos arquivos de entrada (ou na entrada padrão caso nenhum
         arquivo seja informado ou o nome do arquivos seja igual a - ), por lin-
         has que contenham o padrão informado.  Por padrão, grep lista as linhas
         coincidentes.

O pacote "grep" instala: grep, egrep e fgrep

Pra instalar procure pelo pacote: grep

Veja no manual:

   man grep
   grep --help
   info grep
   man egrep
   man fgrep
   man pgrep

Algumas sugestões de pesquisa no Google:

    Re: grep ~linux
    grep ~linux
    how to grep ~linux
    define:grep

resumo de comandos

Grep é muito prático pra refinar a pesquisa, muito útil e pratico pra filtrar resultados de outros comandos, são muitas possibilidades, abaixo algumas dicas pra voce ter uma idéia, tente outras combinações com outros aplicativos.

Quando o resultado na tela for muito extenso, seja resultado do comando, cat, ls, find, tail ou qualquer outro que envie resultado pra tela, acrescente depois do comando "| grep <expressão>", onde <expressão> seja qualquer parte do resultado que deseja filtrar, o grep fará o filtro pra exibir somente as linhas que contenha a expressão indicada, compare o resultado dos dois comandos abaixo.

dmesg

dmesg | grep hd

Algumas diretivas:

-i

a flag "-i" indica pra tratar a palavra ou frase independentemente de ser maiusculas ou minusculas.

-i

a flag "-v" indica pra inverter a seleção, comando com o uso de -v tem o resultado inverso de comandos sem ele.

Pesquisa contendo simbolos e caracteres especiais, use entre aspas para evitar interpretação pelo bash, ou escape com pipe "|", também pode usar os dois, pipe "|" e entre aspas toda a frase da pesquisa, veja os exemplos abaixo.

O grep é muito útil pra filtrar arquivos, contar linhas, numerar linhas, usar em conjunto com outros utilitarios como cat, tail e etc.. procurar por uma frase dentro do arquivo:

grep google /home/zago/guiaz/comandos.txt

cat /var/log/squid/access.log | grep "google"

Pesquisa de strings, independentemente se estar em maiusculas ou minusculas, use a diretiva -i (insensitive)

cat /var/log/squid/access.log | grep -i "google"

grep google /home/zago/guiaz/comandos.txt

Salvar a seleção e outro aquivo, use a diretiva > arqnovo pra criar e salvar o que foi fitrado, com a diretiva >> acrescenta no final do arqnovo.

cat /var/log/squid/access.log | grep -i "google" >> arqnovo

veja também os resulados de:

grep google /var/log/squid/access.log

grep google /var/log/squid/access.log >> arqnovo

Refinar a pesquisa para listar somente ocorrencias iniciando com o termo pesquisado, compare o resultado entre os exemplos abaixo, observe que no primeiro consta somente resultados que iniciam com kde e no segundo consta todos que contenham kde em qualquer parte do nome.

rpm -qa | grep "^kde"

rpm -qa | grep kde

Procura dentro de todos os arquivos que estão abaixo do diretório squid

grep "frase que procuro" -r /var/log/squid/

Com -rin retorna as linhas numeradas, ignora case sensitive e procura em todo sub-diretório, ex.:

grep -rin pacote /home/zago/guiaz/*

grep -rin "Frase que procuro" /home/zago/guiaz/*

Procura por parte do nome do arquivo

Pesquisar somente no nome do arquivo use o find, exemplo pra procurar no diretório /home/zago/guiaz por arquivos que contenha no nome o termo cl9

find /home/zago/guiaz -print |grep -i "cl9"

Algumas dicas e exemplos de uso do grep.

Procurar uma frase em todos os arquivos de um diretório:

   grep "frase que procuro em minusculas" -r /home/zago/guiaz/
   grep -i "frase que procuro com maiusculas e minusculas" -r /home/zago/guiaz/
   grep "frase que procuro pra salvar o resultado em arqfrase.txt" -r /home/zago/guiaz/ > arqfrase.txt
  
  
  Tente também com outras variações do comando.
  
  grep -i "frase que procuro" /home/zago/guiaz/* -R 
  
  
  procurar em um arquivo as linhas que contenham uma palavra OU outra palavra.
  
  egrep '(umapalavra|outrapalavra)'
  
  procurar em todo arquivo
  cat /var/log/squid/access.log | egrep '(extreme|gator)'
  cat /var/log/squid/access.log | egrep -i '(extreme|gator)'

egrep -i "MBR|gcc|temp" /home/zago/guiaz/boot.txt /home/zago/guiaz/gcc.txt

grep - regra pra excluir do filtro ^ o ultimo caracter $ - [^]$

grep [^...] serve pra lista negada, entende letra por letra uma por uma e não palavra que está dentro [^...]

Listar arquivos exceto quando o nome terminar com t.fl por exemplo, em um diretório com muitos arquivos .txt .pdf .html e terminados com um ponto, então pra listar todos menos os terminados em t.fl

$ ls -l | grep [^t\.fl]$

exclue da listagem todos os arquivos que não terminam em "t" ou "." ou "f" ou "l", como é case-sensitive, o exemplo acima filtra somente letras minusculas, use também as maiusculas ou a diretiva -i de (insensitive) pra filtrar minusculas e maiusculas.

ls -l | grep -i [^t\.fl]$

Sem a diretiva -i o comando equivalente seria: ls -l | grep -i [^tT\.fFlL]$

O mesmo vale pra um arquivo texto, neste caso o sinal $ indica que se aplica ao ultimo caracter de cada linha, exemplo, exemplo pra arquivos

cat arq.txt | grep [^t\.fl]$

cat arq.txt | grep -i [^t\.fl]$

cat arq.txt | grep -i [^t\.fl]$ > arqnovo.txt

Pesquisar somente o inicio da linha (^)

Exemplo para remover linhas comentadas com (#) ou (;)

Remove todas as LINHAS que iniciam com # OU ;

egrep -v "^[#;]" /tmp/httpd.conf > httpd.conf-limpo

egrep -v '^#|^;' /tmp/httpd.conf > httpd.conf-limpo

Nos exemplos acima mantém as linhas em branco, no exemplo abaixo remove também as linhas em branco, que inciam com final linha (^$).

egrep -v "^$|[#;]" /tmp/httpd.conf > httpd.conf-limpo

Remover somente as linhas em branco.

egrep -v "^$" /tmp/httpd.conf > httpd.conf-limpo

-A Pegar linhas depois da ocorrencia, -B pegar antes da ocorrencia, copia parcial do man.

         -A NUM, --after-context=NUM
                Print NUM lines of trailing context after matching lines.  
                Places a line containing -- between contiguous groups of matches.
  
         -B NUM, --before-context=NUM
                Print NUM lines of leading context before matching lines.  
                Places a line containing -- between contiguous groups of matches.

Pesquisar pela palavra apertar e pegar as 4 linhas do texto anterior a linha que contém a palavra encontrada.

grep -B4 apertar comandos.txt

-B pegar linhas anteriores, o 4 indica quantas linhas pegar, pegar as 4 posteriores basta trocar -B por -A.

Não retorna erro quando o numero de linhas solicitado exceder o encontrado, solicitar 20 linhas anteriores e encontrar a ocorrencia na terceira linha, retornará somente as 3 linhas sem aviso ou mensagem de erro.

grep com outros aplicativos + pipe |

ls + grep

grep filtrando resultado de ls, listar somente arquivos que contenha "modem" no nome.

ls | grep modem

tail + grep

grep filtrando resultado de tail nos logs.

filtro por IP de origem, exemplo pra monitorar logs do squid, exibir somente os dados do IP 192.168.1.53:

tail -f /var/log/squid/access.log | grep 192.168.1.53

Com Squid autenticado, exibir somente os registros do usuário zago

tail -f /var/log/squid/access.log | grep zago

procurar somente nas ultimas 1000 linhas

tail -1000 /var/log/squid/access.log | egrep '(extreme|gator)'

procurar em multipos arquivos com multiplos argumentos:

egrep "arg1|arg2|arg3" file1 file2 file3 file4

tail -f /var/log/squid/access.log | grep "palavra1\|palavra2\|palavra3" >> /tmp/loggrep.txt

tail -f /var/log/squid/access.log | egrep --line-buffered (palavra1|palavra2|palavra3|...|palavran)

tail -f /var/log/squid/access.log | egrep --line-buffered '(google|globo|uol)'

tail -f /var/log/squid/access.log | grep "google\|globo\|uol" >> /tmp/loggrep.txt

dmesg + grep

exemplos de procura no dmesg, dispositivos detectados no boot.

Listar tudo que contenha hd

dmesg | grep hd

Listar tudo que contenha eth

dmesg | grep eth

Destacar a palavra procurada:

grep --color palavra /home/zago/guiaz/comandos.txt

dmesg | grep --color hd

pegar o PID de processo

pgrep = pegar o numero do PID

pgrep, pkill - look up or signal processes based on name and other attributes

pgrep lista os PID, execute (pgrep nomeprocesso).

Exemplo de retorno do comando para listar processos do ssh

pgrep ssh

  retorna o PID, um por linha.
  5241
  5510
  6174

Outros exemplos que obtem o mesmo resultado.

ps aux | grep ssh | awk '{print $2}'

echo `ps -aux | grep ssh | tr -s " " | cut -d" " -f2`

Compare os resultados dos exemplos acima.

Listar também o nome do programa, PID mais programa.

pgrep -l firefox

Veja também o resultado de pidof

pidof -- find the process ID of a running program.

No SUSE ele vem no pacote sysvinit, exemplos:

pidof ssh

pidof -s ssh

Veja também sobre pkill (matar processos)

SUSE 10.1 - pkill e pgrep faz parte do pacote procps

inverter resultado da pesquisa

grep -v - Inverter seleção

Pra negar palavra use -v que serve pra inverter o funcionamento, no mesmo exemplo acima ele mostra as linhas que _não_ entram no filtro, exibe o resultado inverso dos comandos acima.

   cat arq.txt | grep -v [^t\.fl]$
  
   cat arq.txt | grep -iv [^t\.fl]$
  
   cat arq.txt | grep -iv [^t\.fl]$ > arqnovo.txt

excluir o próprio comando na pequisa com ps -aux

ps -aux grep retorna na listagem o proprio comando da pesquisa.

Isto modifica o resultado e atrapalha em scripts ou conta um processo a mais em wc -l

solução; use o próprio grep para excluir as linhas com grep, inverter o resultado para pegar tudo menos grep.

ps aux | grep processo | grep -v grep

compare os resultados.

  ps aux | grep ssh
  
  ps aux | grep ssh | grep -v grep
  
  ps aux | grep ssh | grep -v grep | wc -l 

compare o resultado destes comandos ou de outro aplicativo, para excluir o resultado do proprio comando na pesquisa, coloque a primeira letra da procura entre [ ]

  ps aux | grep ssh
  ps aux | grep [s]sh
  
  ps aux | grep konqueror
  ps aux | grep [k]onqueror

zgrep pesquisar em arquivos gzipados

zgrep

A variante zgrep funciona em arquivos gzipados.

man zgrep

zgrep - search possibly compressed files for a regular expression

zgrep vem no mesmo pacote do gzip

exemplo de uso.

zgrep oqueprocura arquivo.gz

Indicações

grep - FAQ com mensagens da Linux-br
http://www.zago.eti.br/script/grep.txt

Página principal sobre script em geral (FAQ)
http://www.zago.eti.br/script/A-menu-scripts.html

Página principal deste site (FAQ)
http://www.zago.eti.br/menu.html