linhas de comando e scripts com uso do grep, egrep, fgrep e semelhantes na edição de arquivos textos ou dados passados pelo pipe |.
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
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
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 filtrando resultado de ls, listar somente arquivos que contenha "modem" no nome.
ls | grep modem
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
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
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
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
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