Como usar o comando grep no Linux

Conteúdo

Um prompt de terminal em um PC Linux.

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

A história por trás do grep

a grep O comando é famoso no Linux e Unix círculos por três razões. Em primeiro lugar, é tremendamente útil. Em segundo lugar, a o grande número de opções pode ser esmagador. Em terceiro lugar, foi escrito durante a noite para atender a uma necessidade particular. Os dois primeiros são muito bons; o terceiro está ligeiramente desligado.

Ken Thompson Eu tinha extraído o frase regular capacidades de pesquisa ed editor (pronunciado ee-dee) e criei um pequeno programa, para seu próprio uso, para pesquisar arquivos de texto. Seu chefe de departamento em Bell Labs, Doug Mcilroy, abordou Thompson e descreveu o problema para um de seus colegas, Lee McMahon, Eu estava enfrentando.

McMahon estava tentando identificar os autores do Artigos Federalistas através da análise textual. Eu 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 outras pessoas poderiam usar e renomeou-a grep. Levou o nome do ed cadeia de comando g/re/p , que se traduce comobúsqueda global de expresiones regulares”.

Você pode ver Thompson falando para Brian Kernighan sobre o nascimento de grep.

Pesquisas simples com grep

Para procurar uma string dentro de um arquivo, passar termo de pesquisa e nome de arquivo na linha de comando:

grep dave / etc / senha e um terminal widnow

Linhas correspondentes são exibidas. Para este caso, é uma única linha. O texto correspondente é destacado. Isso ocorre porque na maioria das distribuições grep tem um alias para:

alias grep = 'grep --colour = auto'

Vejamos os resultados onde existem várias linhas que correspondem. Buscaremos la palabra “Média” en un archivo de registro de la aplicación. Porque não podemos lembrar se a palavra está em minúsculas no arquivo de log, nós vamos usar o -i (ignorar maiúsculas e minúsculas) opção:

grep -i Average geek-1.log

Todas as linhas correspondentes são exibidas, com o texto correspondente destacado em cada.

Podemos mostrar as linhas que não correspondem usando a opção -v (jogo reverso).

grep -v Mem geek-1.log

Não há destaque porque essas são as linhas incompatíveis.

Nós podemos causar grep fique totalmente silencioso. O resultado é passado para o shell como um valor de retorno de grep. Um resultado de zero significa que a string era encontrado, e o resultado de um significa que não estava Encontros. Podemos verificar o código de retorno usando o $? parâmetros especiais:

grep -q médio geek-1.log
eco $?
grep -q systempeaker geek-1.log
eco $?

Pesquisas recursivas com grep

Para pesquisar diretórios e subdiretórios aninhados, use a opção -r (recursivo). Observe que você não fornece um nome de arquivo na linha de comando, deve fornecer um caminho. Aquí estamos buscando en el directorio actual “.” y cualquier subdirectorio:

grep -r -i memfree .

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

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

ls -l logs-folder

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

grep -R -i memfree .

Siga o link simbólico e pesquise no diretório para o qual ele aponta. grep O que mais.

Procurando por palavras inteiras

Por padrão, grep irá corresponder a uma linha se o alvo de pesquisa aparecer em qualquer parte dessa linha, mesmo dentro de outra string. Veja este exemplo. Vamos a buscar la palabra “de graça”.

grep -i free geek-1.log

Los resultados son líneas que disponen la cadenalibreen ellas, mas não são palavras separadas. Forman parte de la cadenaMemFree”.

Forçar grep para hacer coincidir solo “palavras” separadas, Use o -w (word regexp) opção.

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

Esta vez no hay resultados debido a que el término de búsqueda “de graça” no aparece en el archivo como una palabra separada.

Usando vários termos de pesquisa

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

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

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

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 sejam necessariamente palavras inteiras., mas também podem ser palavras inteiras.

a -e Opção (padrões) permite que você use vários termos de pesquisa na linha de comando. Estamos usando a função de colchetes regex para criar um padrão de pesquisa. Dados grep para que coincida con cualquiera de los caracteres incluidos entre corchetes “[]. ” Isso significa grep irá corresponder a "kB" ou "KB" durante a pesquisa.

Ambas as strings correspondem e, na realidade, algumas linhas contêm ambas as strings.

Correspondência exata de linhas

a -x (linha regexp) corresponderá apenas às linhas onde o linha completa corresponde ao termo de pesquisa. Vamos procurar um carimbo de data / 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 partida. Isso pode ser útil ao procurar por arquivos de configuração. Os comentários são ótimos, mas de vez em quando é difícil identificar a configuração real entre todos eles. Aqui está o /etc/sudoers procedimentos:

Podemos filtrar efetivamente as linhas de comentários desta forma:

sudo grep -v "#" /etc / sudoers

Isso é muito mais fácil de analisar.

Apenas exibição de texto correspondente

Pode haver um momento em que você não queira ver toda a linha correspondente, apenas o texto correspondente. a -o Opção (apenas combinar) faz exatamente isso.

grep -o MemFree geek-1.log

A tela é 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, também pode fornecer informações numéricas. Podemos fazer grep conta para nós de maneiras diferentes. Se quisermos saber quantas vezes uma definição de pesquisa aparece em um arquivo, podemos usar o -c (contar) opção.

grep -c average geek-1.log

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

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

grep -n Jan geek-1.log

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

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

grep -m5 -n Jan geek-1.log

Adicionar contexto

Muitas vezes é útil ser capaz de ver algumas linhas extras, linhas possivelmente incompatíveis, para cada linha correspondente. pode ajudá-lo a distinguir quais das linhas correspondentes são aquelas nas quais você está interessado.

Para mostrar algumas linhas após a linha correspondente, use uma opção (depois do contexto). Estamos solicitando três linhas neste exemplo:

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

Para ver algumas linhas antes da linha correspondente, usar el -B (contexto antes) opção.

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

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

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

Mostrar arquivos correspondentes

Para ver os nomes dos arquivos que contêm o termo de pesquisa, use o -l (arquivos correspondentes) opção. Para descobrir quais arquivos de origem C contêm referências ao sl.h arquivo de cabeçalho, use este comando:

grep -l "sl.h" *.c

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

E, decididamente, podemos pesquisar arquivos que não contenham o termo de pesquisa. a -L Opção (arquivos incomparáveis) faz exatamente isso.

grep -L "sl.h" *.c

Início e fim das linhas

Podemos forçar grep para mostrar 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 do arquivo de log conterão espaços, mas vamos procurar por linhas que tenham um espaço como o primeiro caractere:

grep "^ " geek-1.log

As linhas que têm um espaço como o primeiro caractere são exibidas, no começo da linha.

Para combinar com o fim da linha, use el operador de expresión regular “$”. Vamos a buscar líneas que terminen con “00”.

grep "00$" geek-1.log

La pantalla muestra las líneas que disponen “00” como caracteres finales.

Usando Pipes com grep

Decididamente, pode canalizar a entrada para grep , canalizar a saída de grep em outro programa e ter grep aninhado no meio de uma cadeia de tubos.

Digamos que queremos ver todas las apariciones de la cadena “ExtractParameters” en nuestros archivos de código fuente C. Nós 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 na lista de arquivos e use less's facilidade de busca.

Se canalizarmos a saída de grep dentro de wc e usar o -l (linhas) opção, nós pode contar o número de linhas en los archivos de código fuente que contienen “ExtractParameters”. (Podemos conseguir isso usando o grep -c (contar) opção, mas esta é uma boa maneira de demonstrar o tubo do lado de fora grep.)

grep "ExtractParameters" *.c | wc -l

Com o seguinte comando, estamos canalizando a produção de ls dentro de grep e canalizando a saída de grep dentro de sort . Estamos listando os arquivos no diretório atual, seleccionando aquellos con la cadena “Agosto” neles, e classificando-os por tamanho de arquivo:

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

Vamos analisar isso:

  • ls -l: Faça uma lista de arquivos de formato longo usando ls.
  • grep “agosto: Selecione as linhas do ls listado que tiene “Agosto” neles. Tenga en cuenta que esto además encontrará archivos que tengan “Agosto” en sus nombres.
  • pedido + 4n: Classifique a saída de grep na quarta coluna ().

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

RELACIONADO: Como usar Pipes no Linux

grep: Menos um comando, mais um aliado

grep é uma ótima ferramenta para ter à sua disposição. No 1974 e ainda é forte porque precisamos do que ele faz, e nada o torna melhor.

Acoplamento grep com alguma regex, fu realmente leva isso para o próximo nível.

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

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.