Como usar o comando grep no Linux

Um prompt de terminal em um PC Linux.
Fatmawati Achmad Zaenuri / Shutterstock

O grepcomando Linux é um utilitário de correspondência de string e padrão que exibe linhas correspondentes de vários arquivos. Também funciona com saída canalizada de outros comandos. Nós mostramos como.

A história por trás do grep

O grepcomando é famoso nos círculos Linux e Unix por três motivos. Em primeiro lugar, é extremamente útil. Em segundo lugar, a riqueza de opções pode ser esmagadora . Em terceiro lugar, foi escrito durante a noite para satisfazer uma necessidade particular. Os dois primeiros estão ligados; a terceira está ligeiramente desligada.

Ken Thompson extraiu os recursos de pesquisa de expressão regular do ededitor ( pronuncia-se ee-dee ) e criou um pequeno programa – para seu próprio uso – para pesquisar arquivos de texto. Seu chefe de departamento na Bell Labs , Doug Mcilroy , abordou Thompson e descreveu o problema que um de seus colegas, Lee McMahon , estava enfrentando.

McMahon estava tentando identificar os autores dos artigos federalistas por meio da análise textual. Ele precisava de uma ferramenta que pudesse pesquisar frases e strings em arquivos de texto. Thompson passou cerca de uma hora naquela noite tornando sua ferramenta um utilitário geral que poderia ser usado por outras pessoas e renomeou-a como grep. Ele pegou o nome da edstring de comando g/re/p, que se traduz como “pesquisa de expressão regular global”.

Você pode assistir Thompson falando com Brian Kernighan sobre o nascimento de grep.

Pesquisas simples com grep

Para pesquisar uma string dentro de um arquivo, passe o termo de pesquisa e o nome do arquivo na linha de comando:

grep dave / etc / senha em um terminal widnow

Linhas correspondentes são exibidas. Nesse caso, é uma única linha. O texto correspondente é destacado. Isso ocorre porque na maioria das distribuições greptem o alias de:

alias grep = 'grep --colour = auto'

Vejamos os resultados em que existem várias linhas correspondentes. Procuraremos a palavra “Média” em um arquivo de log do aplicativo. Como não podemos nos lembrar se a palavra está em minúsculas no arquivo de log, usaremos a opção -i (ignorar maiúsculas e minúsculas):

grep -i Average geek-1.log

grep -i Average geek-1.log em uma janela de terminal

Cada linha correspondente é exibida, com o texto correspondente destacado em cada uma.

Saída de grep -i Average geek-1.log em uma janela de terminal

Podemos exibir as linhas não correspondentes usando a opção -v (inverter correspondência).

grep -v Mem geek-1.log

grep -v Mem geek-1.log em uma janela de terminal

Não há realce porque essas são as linhas não correspondentes.

Recomendado:  Como compartilhar sua senha Wi-Fi entre iPhones

saída de grep -v Mem geek-1.log em uma janela de terminal

Podemos fazer grepcom que fiquemos completamente silenciosos. O resultado é passado para o shell como um valor de retorno de grep. Um resultado zero significa que a string foi encontrada, e um resultado de um significa que ela não foi encontrada. Podemos verificar o código de retorno usando os  $? parâmetros especiais :

grep -q médio geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

grep -q average geek-1.log em uma janela de terminal

Pesquisas recursivas com grep

Para pesquisar em diretórios e subdiretórios aninhados, use a opção -r (recursiva). Observe que você não fornece um nome de arquivo na linha de comando, você deve fornecer um caminho. Aqui, estamos pesquisando no diretório atual “.” e quaisquer subdiretórios:

grep -r -i memfree.

grep -r -i memfree.  em uma janela de terminal

A saída inclui o diretório e o nome do arquivo de cada linha correspondente.

saída de grep -r -i memfree.  em uma janela de terminal

Podemos fazer  grep  seguir links simbólicos usando a opção -R(desreferência recursiva). Temos um link simbólico neste diretório, chamado logs-folder. Ele aponta para /home/dave/logs.

ls -l logs-folder

ls -l logs-folder em uma janela de terminal

Vamos repetir nossa última pesquisa com a opção  -R(desreferência recursiva):

grep -R -i memfree.

grep -R -i memfree.  em uma janela de terminal

O link simbólico é seguido e o diretório para o qual ele aponta também é pesquisado grep.

Saída de grep -R -i memfree.  em uma janela de terminal

Procurando por palavras inteiras

Por padrão, grepcorresponderá a uma linha se o destino da pesquisa aparecer em qualquer lugar dessa linha, inclusive dentro de outra string. Veja este exemplo. Vamos pesquisar a palavra “grátis”.

grep -i free geek-1.log

grep -i free geek-1.log em uma janela de terminal

Os resultados são linhas que contêm a string “free”, mas não são palavras separadas. Eles fazem parte da string “MemFree”.

Saída de grep -i free geek-1.log em uma janela de terminal

Para forçar grep a correspondência apenas de “palavras” separadas, use a opção -w(expressão regular da palavra).

grep -w -i free geek-1.log
echo $?

grep -w -i free geek-1.log em uma janela de terminal

Desta vez, não há resultados porque o termo de pesquisa “grátis” não aparece no arquivo como uma palavra separada.

Usando vários termos de pesquisa

A opção -E(expressão regular estendida) permite que você pesquise várias palavras. (A -Eopção substitui a egrep versão obsoleta de grep.)

Este comando procura por dois termos de pesquisa, “média” e “livre de memos”.

grep -E -w -i "average | memfree" geek-1.log

grep -E -w -i "average | memfree" geek-1.log em uma janela de terminal

Todas as linhas correspondentes são exibidas para cada um dos termos de pesquisa.

Saída de grep -E -w -i "average | memfree" geek-1.log em uma janela de terminal

Você também pode pesquisar vários termos que não são necessariamente palavras inteiras, mas também podem ser palavras inteiras.

A -eopção (padrões) permite que você use vários termos de pesquisa na linha de comando. Estamos usando o recurso de colchetes de expressão regular para criar um padrão de pesquisa. Diz greppara corresponder a qualquer um dos caracteres contidos nos colchetes “[].” Isso significa grepque corresponderá a “kB” ou “KB” durante a pesquisa.

grep -e MemFree -e [kK] B geek-1.log em uma janela de terminal

Ambas as strings são correspondidas e, de fato, algumas linhas contêm ambas as strings.

Saída de grep -e MemFree -e [kK] B geek-1.log em uma janela de terminal

Linhas correspondentes exatamente

-x(expressão regular de linha) irá corresponder apenas às linhas em que toda a linha corresponde ao termo de pesquisa. Vamos procurar um carimbo de data e hora que sabemos que aparece apenas uma vez no arquivo de log:

grep -x "20 de janeiro - 06 15:24:35" geek-1.log

grep -x "20-Jan - 06 15:24:35" geek-1.log em uma janela de terminal

A única linha que corresponde é encontrada e exibida.

Recomendado:  O que é o sistema de arquivos interplanetário (IPFS) e como você o usa?

O oposto disso é apenas mostrar as linhas que não correspondem. Isso pode ser útil quando você está olhando para arquivos de configuração. Os comentários são ótimos, mas às vezes é difícil identificar as configurações reais entre todos eles. Aqui está o /etc/sudoersarquivo:

Conteúdo do arquivo / etc / sudoers em uma janela de terminal

Podemos filtrar com eficácia as linhas de comentários como esta:

sudo grep -v "#" / etc / sudoers

sudo grep -v "#" / etc / sudoers em uma janela de terminal

Isso é muito mais fácil de analisar.

Exibindo apenas texto correspondente

Pode haver uma ocasião em que você não queira ver toda a linha correspondente, apenas o texto correspondente. A opção -o(apenas correspondência) faz exatamente isso.

grep -o MemFree geek-1.log

grep -o MemFree geek-1.log em uma janela de terminal

A exibição é reduzida para mostrar apenas o texto que corresponde ao termo de pesquisa, em vez de toda a linha correspondente.

saída de grep -o MemFree geek-1.log em uma janela de terminal

Contando com grep

grepnão se trata apenas de texto, ele também pode fornecer informações numéricas. Podemos fazer grepvaler por nós de diferentes maneiras. Se quisermos saber quantas vezes um termo de pesquisa aparece em um arquivo, podemos usar a -copção (contagem).

grep -c average geek-1.log

grep -c average geek-1.log em uma janela de terminal

grep relata que o termo de pesquisa aparece 240 vezes neste arquivo.

Você pode fazer grepexibir o número da linha para cada linha correspondente usando a opção -n(número da linha).

grep -n Jan geek-1.log

grep -n jan geek-1.log em uma janela de terminal

O número da linha para cada linha correspondente é exibido no início da linha.

Saída de grep -n jan geek-1.log em uma janela de terminal

Para reduzir o número de resultados exibidos, use a opção -m(contagem máxima). Vamos limitar a saída a cinco linhas correspondentes:

grep -m5 -n Jan geek-1.log

grep -m5 -n Jan geek-1.log em uma janela de terminal

Adicionando Contexto

Ser capaz de ver algumas linhas adicionais – possivelmente linhas não correspondentes – para cada linha correspondente é frequentemente útil. pode ajudar a distinguir quais das linhas correspondentes são aquelas nas quais você está interessado.

Para mostrar algumas linhas após a linha correspondente, use a opção -A (após o contexto). Estamos pedindo três linhas neste exemplo:

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log em uma janela de terminal

Para ver algumas linhas anteriores à linha correspondente, use a opção -B(contexto anterior).

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log em uma janela de terminal

E para incluir linhas de antes e depois da linha correspondente, use a -Copção (contexto).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log em uma janela de terminal

Mostrando arquivos correspondentes

Para ver os nomes dos arquivos que contêm o termo de pesquisa, use a opção -l (arquivos com correspondência). Para descobrir quais arquivos de código-fonte C contêm referências ao sl.harquivo de cabeçalho, use este comando:

grep -l "sl.h" * .c

grep -l "sl.h" * .c em uma janela de terminal

Os nomes dos arquivos são listados, não as linhas correspondentes.

Recomendado:  Como enviar mensagens manuscritas e de toque digital no iOS 10

Saída de grep -l "sl.h" * .c em uma janela de terminal

E, claro, podemos procurar arquivos que não contenham o termo de busca. A opção -L(arquivos sem correspondência) faz exatamente isso.

grep -L "sl.h" * .c

grep -L "sl.h" * .c em uma janela de terminal

Início e fim das linhas

Podemos forçar grepa exibição apenas das correspondências que estão no início ou no final de uma linha. O operador de expressão regular “^” corresponde ao início de uma linha. Praticamente todas as linhas dentro do arquivo de log conterão espaços, mas vamos pesquisar as linhas que têm um espaço como primeiro caractere:

grep "^" geek-1.log

grep "^" geek-1.log em uma janela de terminal

As linhas que possuem um espaço como o primeiro caractere – no início da linha – são exibidas.

Gerar grep "^" geek-1.log em uma janela de terminal

Para corresponder ao final da linha, use o operador de expressão regular “$”. Vamos pesquisar as linhas que terminam com “00”.

grep "00 $" geek-1.log

grep "00 $" geek-1.log em uma janela de terminal

O visor mostra as linhas que têm “00” como caracteres finais.

saída de grep "00 $" geek-1.log em uma janela de terminal

Usando Pipes com grep

Claro, você pode canalizar a entrada para grep, canalizar a saída de grepoutro programa e grepaninhar no meio de uma cadeia de canos.

Digamos que queremos ver todas as ocorrências da string “ExtractParameters” em nossos arquivos de código-fonte C. Sabemos que haverá alguns, então canalizamos a saída para less:

grep "ExtractParameters" * .c | Menos

grep "ExtractParameters" * .c |  menos em uma janela de terminal

A saída é apresentada em less.

Saída de grep "ExtractParameters" * .c |  menos em uma janela de terminal

Isso permite que você percorra a lista de arquivos e use o less'srecurso de pesquisa.

Se canalizar a saída de grepem wce usar a -lopção (linhas), que pode contar o número de linhas em arquivos de código de origem que contêm “ExtractParameters”. (Poderíamos conseguir isso usando a grep -copção (contagem), mas esta é uma maneira legal de demonstrar a tubulação grep.)

grep "ExtractParameters" * .c | wc -l

grep "ExtractParameters" * .c |  wc -l em uma janela de terminal

Com o próximo comando, nós estamos canalizando a saída de lsdentro grepe canalizando a saída de grepdentro sort. Estamos listando os arquivos no diretório atual, selecionando aqueles com a string “Aug” e classificando-os por tamanho de arquivo :

ls -l | grep "agosto" | classificar + 4n

ls -l |  grep "agosto" |  classificar + 4n em uma janela de terminal

Vamos decompô-lo:

  • ls -l : Executa uma lista de formato longo dos arquivos usando ls.
  • grep “Aug” : Selecione as linhas da lslista que contêm “Aug”. Observe que isso também localizaria arquivos com “agosto” em seus nomes.
  • sort + 4n : Classifica a saída do grep na quarta coluna (tamanho do arquivo).

Obtemos uma lista ordenada de todos os arquivos modificados em agosto (independentemente do ano), em ordem crescente de tamanho do arquivo.

grep: menos um comando, mais um aliado

grepé uma ferramenta excelente para se ter à sua disposição. Ele data de 1974 e ainda está forte porque precisamos do que ele faz, e nada o faz melhor.

O acoplamento grepcom algumas expressões regulares-fu realmente leva isso para o próximo nível.