O comando grep do Linux é um utilitário de correspondência de strings e padrões que exibe linhas correspondentes de vários arquivos. Também funciona com saída canalizada de outros comandos. Nós mostramos como.
últimas postagens
A história por trás do grep
O comando grep é famoso no Linux e Unix círculos por três razões. Em primeiro lugar, é extremamente útil. Em segundo lugar, o riqueza de opções pode ser opressora. Em terceiro lugar, foi escrito durante a noite para satisfazer uma necessidade específica. Os dois primeiros estão ligados; a terceira está ligeiramente desligada.
Ken Thompson extraiu os recursos de pesquisa de expressão regular do editor ed (pronunciado ee-dee) e criou 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 de um de seus colegas, Lee McMahon, estava enfrentando.
McMahon estava tentando identificar os autores do Papéis 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 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 falando para Brian Kernighan sobre o nascimento do 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:
Linhas correspondentes são exibidas. Nesse caso, é uma única linha. O texto correspondente é destacado. Isso ocorre porque na maioria das distribuições grep tem 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
Cada linha correspondente é exibida, com o texto correspondente destacado em cada uma.
Podemos exibir as linhas não correspondentes usando a opção -v (inverter correspondência).
grep -v Mem geek-1.log
Não há realce porque essas são as linhas não correspondentes.
Podemos fazer com que o grep fique completamente silencioso. O resultado é passado para o shell como um valor de retorno do 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 o $? parâmetros especiais:
grep -q average geek-1.log
echo $?
grep -q wdzwdz geek-1.log
echo $?
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 (desreferência recursiva). Temos um link simbólico neste diretório, chamado logs-folder. Ele aponta para / home / dave / logs.
ls -l logs-folder
Vamos repetir nossa última pesquisa com a opção -R (desreferência recursiva):
grep -R -i memfree .
O link simbólico é seguido e o diretório para o qual ele aponta também é pesquisado pelo grep.
Procurando por palavras inteiras
Por padrão, grep irá corresponder a uma linha se o alvo da pesquisa aparecer em qualquer lugar dessa linha, incluindo dentro de outra string. Veja este exemplo. Vamos pesquisar a palavra “grátis”.
grep -i free geek-1.log
Os resultados são linhas que contêm a string “free”, 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 (expressão regular da palavra).
grep -w -i free geek-1.log
echo $?
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 opção -E substitui o obsoleto versão egrep 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
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ão regular para criar um padrão de pesquisa. Diz ao grep para corresponder a qualquer um dos caracteres contidos entre parênteses “[]. ” Isso significa que o grep irá corresponder a “kB” ou “KB” durante a pesquisa.
Ambas as strings são correspondidas e, de fato, algumas linhas contêm ambas as strings.
Linhas correspondentes exatamente
O -x (expressão regular de linha) corresponderá apenas às linhas em que toda a linha corresponda 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. Este é o arquivo / etc / sudoers:
Podemos filtrar com eficácia as linhas de comentários como esta:
sudo grep -v "https://www.wdzwdz.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers
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
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 trata apenas de 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 average 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
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 coincidente é 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
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 anteriores e posteriores à 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.
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 correspondências que estejam 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 linhas que tenham um espaço como primeiro caractere:
grep "^ " geek-1.log
As linhas que possuem um espaço como o primeiro caractere – no início da linha – são exibidas.
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
O visor mostra as linhas que têm “00” como 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 canalização.
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 o resultado para menos:
grep "ExtractParameters" *.c | less
A saída é apresentada em menos.
Isso permite que você percorra a lista de arquivos e use o recurso de pesquisa do less.
Se canalizarmos a saída de grep para wc e usarmos a opção -l (linhas), pode contar o número de linhas nos arquivos de código-fonte que contêm “ExtractParameters”. (Poderíamos conseguir isso usando a opção grep -c (count), mas esta é uma maneira legal de demonstrar a tubulação fora do 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” neles, e classificando-os por tamanho de arquivo:
ls -l | grep "Aug" | sort +4n
Vamos decompô-lo:
ls -l: Executa uma listagem de formato longo dos arquivos usando ls.
grep “Aug”: Selecione as linhas da lista ls que contêm “Aug”. Observe que isso também localizaria arquivos com “Aug” 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.
Acoplar o grep a algumas expressões regulares-fu realmente o leva ao próximo nível.