Tail & Grep & eGrep

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