grep - alguns exemplos de uso e linha de comando
Atualizado em: %%mtime(%d/%m/%Y)
%!target: html
%!options: --toc --toc-level 2 --encoding iso-8859-1
%!preproc: IMGPATH ../userguide
%!postproc(html): '(<LI>.*include </A>)$' '\1 <b>[NOVO!]</b>'
%!postproc(html): '(<LI>.*%!Target</A>)$' '\1 <b>[NOVO!]</b>'
%!postproc(html): '(<LI>.*%!Options</A>)$' '\1 <b>[NOVO!]</b>'
%!postproc(html): '(<LI>.*linha de comando</A>)$' '\1 <b>[NOVO!]</b>'
%!postproc(html): '(<LI>.*Editores de Texto</A>)$' '\1 <b>[NOVO!]</b>'
%%% Embedded CSS code
%
%!postproc(html): ^<HEAD>$ '<HEAD>\n<STYLE TYPE="text/css">\n@#@'
%!postproc(html): (@#@)$ 'body {background-color:#ddeeff; color:black; \n\1'
%!postproc(html): (@#@)$ ' margin:2em; text-align:justify;} \n\1'
%!postproc(html): (@#@)$ 'a {text-decoration:none;}\na:hover {color:red;}\n\1'
%!postproc(html): (@#@)$ 'a:visited {color:purple;}\ndl {margin:1em;} \n\1'
%!postproc(html): (@#@)$ 'h1 {text-align:center; background-color:blue; \n\1'
%!postproc(html): (@#@)$ ' color:white; padding:8px;} \n\1'
%!postproc(html): (@#@)$ 'h2 {padding-top:20px;}\nhr {border-style:none;}\n\1'
%!postproc(html): (@#@)$ 'code {background-color:lightblue;} \n\1'
%!postproc(html): (@#@)$ 'table {border-style:solid; border-color:black;}\n\1'
%!postproc(html): (@#@)$ 'th {background-color:lightblue; padding:1em;} \n\1'
%!postproc(html): (@#@)$ 'td {border-style:none; background-color:white;}\n\1'
%!postproc(html): (@#@)$ 'pre {border-style:solid; border-width:1px 1px; \n\1'
%!postproc(html): (@#@)$ ' background-color:lightblue; padding:8px; \n\1'
%!postproc(html): (@#@)$ ' border-color:black;} \n\1'
%!postproc(html): @#@$ </STYLE>
% Endereço do documento convertido para HTML: http://www.zago.eti.br/script/grep.html
% Sistema automatizado por scripts e txt2tags
% Antonio Francisco Zago zagolinux@uol.com.br
= 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