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 como “bú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:
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 cadena “libre” en ellas, mas não são palavras separadas. Forman parte de la cadena “MemFree”.
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