Como usar o comando grep no Linux

Publicados: 2022-01-29
Um prompt de terminal em um PC Linux.
Fatmawati Achmad Zaenuri/Shutterstock

O comando grep do Linux é um utilitário de correspondência de strings e padrões que exibe linhas correspondentes de vários arquivos. Ele também funciona com saída canalizada de outros comandos. Nós mostramos-lhe como.

A história por trás do grep

O comando grep é famoso nos círculos Linux e Unix por três razões. Em primeiro lugar, é tremendamente útil. Em segundo lugar, a riqueza de opções pode ser esmagadora. Em terceiro lugar, foi escrito da noite para o dia para satisfazer uma necessidade específica. Os dois primeiros estão em alta; o terceiro está um pouco fora.

Ken Thompson extraiu os recursos de pesquisa de expressão regular do editor ed (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.

10 comandos básicos do Linux para iniciantes
RELACIONADOS 10 comandos básicos do Linux para iniciantes

McMahon estava tentando identificar os autores dos artigos federalistas por meio de 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 a renomeou como grep . Ele pegou o nome da string de comando ed g/re/p , que se traduz como “pesquisa de expressão regular global”.

Você pode assistir Thompson conversando com Brian Kernighan sobre o nascimento do grep .

Pesquisas simples com grep

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

grep dave /etc/password em um terminal widnow
Propaganda

As linhas correspondentes são exibidas. Neste caso, é uma única linha. O texto correspondente é realçado. Isso ocorre porque na maioria das distribuições o grep é alias para:

 alias grep='grep --colour=auto'

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

 grep -i Average geek-1.log 

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

Podemos exibir as linhas não correspondentes usando a opção -v (invert match).

 grep -v Mem geek-1.log 

Não há destaque porque estas são as linhas não correspondentes.

Propaganda

Podemos fazer com que o grep fique completamente silencioso. O resultado é passado para o shell como um valor de retorno de grep . Um resultado de 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 o $? parâmetros especiais:

 grep -q média geek-1.log
 eco $?
 grep -q howtogeek geek-1.log
 eco $? 

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 . 

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

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

 ls -l pasta de logs 

Vamos repetir nossa última busca com a opção -R (recursive dereference):

 grep -R -i memfree . 

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

Procurando palavras inteiras

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

 grep -i free geek-1.log 

Propaganda

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

Para forçar o grep a corresponder apenas a “palavras” separadas, use a opção -w (palavra regexp).

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

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

Como usar vários termos de pesquisa

A opção -E (extended regexp) permite pesquisar várias palavras. (A opção -E substitui a versão egrep obsoleta de grep .)

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

 grep -E -w -i "média|memfree" geek-1.log 

Propaganda

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

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

A opção -e (padrões) permite que você use vários termos de pesquisa na linha de comando. Estamos usando o recurso de colchetes de expressões regulares para criar um padrão de pesquisa. Ele diz ao grep para corresponder a qualquer um dos caracteres contidos nos colchetes “[]”. Isso significa que o grep corresponderá a “kB” ou “KB” à medida que pesquisa.

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

Linhas de correspondência exata

O -x (linha regexp) corresponderá apenas às linhas em que a linha inteira 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-Jan--06 15:24:35" geek-1.log 

A única linha que corresponde é encontrada e exibida.

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 arquivo /etc/sudoers :

Propaganda

Podemos filtrar efetivamente as linhas de comentários assim:

 sudo grep -v "#" /etc/sudoers 

Isso é muito mais fácil de analisar.

Exibindo apenas o 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 

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

Contando com grep

grep não é apenas sobre texto, ele também pode fornecer informações numéricas. Podemos fazer o grep contar para nós de diferentes maneiras. Se quisermos saber quantas vezes um termo de pesquisa aparece em um arquivo, podemos usar a opção -c (contagem).

 grep -c média geek-1.log 

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

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

 grep -n Jan geek-1.log 

Propaganda

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

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 

Adicionando contexto

Ser capaz de ver algumas linhas adicionais – possivelmente linhas não correspondentes – para cada linha correspondente é frequentemente útil. ele pode ajudar a distinguir quais das linhas correspondentes são aquelas em que 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 

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 

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

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

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 arquivo de cabeçalho sl.h , use este comando:

 grep -l "sl.h" *.c 

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

Propaganda

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

 grep -L "sl.h" *.c 

Início e Fim das Linhas

Podemos forçar o grep a exibir apenas as 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 procurar por linhas que tenham um espaço como seu primeiro caractere:

 grep "^ " geek-1.log 

As linhas que têm um espaço como primeiro caractere—no início da linha—são exibidas.

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

 grep "00$" geek-1.log 

O display mostra as linhas que possuem “00” como seus caracteres finais.

Usando Pipes com grep

Claro, você pode canalizar a entrada para o grep , canalizar a saída do grep para outro programa e ter o grep aninhado no meio de uma cadeia de canal.

Propaganda

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 

A saída é apresentada em less .

Isso permite que você navegue pela lista de arquivos e use o recurso less's .

Se canalizarmos a saída de grep para wc e usarmos a opção -l (linhas), podemos contar o número de linhas nos arquivos de código-fonte que contêm “ExtractParameters”. (Podemos conseguir isso usando a opção grep -c (count), mas essa é uma maneira legal de demonstrar a saída de grep .)

 grep "ExtractParameters" *.c | wc -l 

Com o próximo comando, estamos canalizando a saída de ls para grep e canalizando a saída de grep para 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 

Vamos separar isso:

  • ls -l : executa uma listagem de formato longo dos arquivos usando ls .
  • grep “Aug” : Selecione as linhas da listagem ls que tenham “Aug” nelas. Observe que isso também localizaria arquivos que têm “Aug” em seus nomes.
  • sort +4n : Ordena 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 de arquivo.

RELACIONADO: Como usar Pipes no Linux

grep: Menos um comando, mais um aliado

grep é uma ferramenta fantástica para ter à sua disposição. Data de 1974 e continua forte porque precisamos do que ela faz, e nada melhor.

Acoplar grep com algumas expressões regulares-fu realmente leva isso para o próximo nível.

RELACIONADO: Como usar expressões regulares básicas para pesquisar melhor e economizar tempo

RELACIONADO: Melhores laptops Linux para desenvolvedores e entusiastas