Como usar o comando grep no Linux
Fatmawati Achmad Zaenuri / Shutterstock
O comando Linux grep é um utilitário de correspondência de cadeias e padrões que exibe linhas correspondentes de vários arquivos. Também funciona com saída canalizada de outros comandos. Nós mostramos a você 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 são estrondosos; o terceiro está ligeiramente desligado.
Ken Thompson extraiu os recursos de pesquisa de expressão regular do editor de ed (pronuncia-se ee-dee) e criou um pequeno programa "para uso próprio" para pesquisar arquivos de texto. Seu chefe de departamento no 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 trabalhos federalistas através da análise textual. Ele precisava de uma ferramenta que pudesse procurar frases e strings em arquivos de texto. Thompson passou cerca de uma hora naquela noite fazendo de sua ferramenta um utilitário geral que pudesse ser usado por outros e renomeou-o como grep. Ele pegou o nome da cadeia 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 procurar uma string em um arquivo, passe o termo de pesquisa e o nome do arquivo na linha de comando:
As linhas correspondentes são exibidas. Nesse caso, é uma única linha. O texto correspondente é destacado. Isso ocorre porque, na maioria das distribuições, o grep é um alias para:
alias grep = 'grep --colour = auto'
Vamos analisar os resultados onde existem várias linhas correspondentes. Vamos procurar a palavra "Média" ” em um arquivo de log do aplicativo. Como não podemos lembrar se a palavra está em letras minúsculas no arquivo de log, usaremos a opção -i (ignorar maiúsculas e minúsculas):
grep -i Média de geek-1. log
Todas as linhas correspondentes são exibidas, com o texto correspondente destacado em cada uma.
Podemos exibir as linhas não correspondentes usando a opção -v (correspondência invertida).
grep -v Mem geek-1. log
Não há destaque porque essas são as linhas que não correspondem.
Podemos fazer com que o grep fique completamente silencioso. O resultado é passado para o shell como um valor de retorno do grep. Um resultado de zero significa que a cadeia foi encontrada e um resultado de um significa que não foi encontrada. Podemos verificar o código de retorno usando os parâmetros especiais $?:
grep -q média geek-1. log
ecoa $?
grep -q howtogeek geek-1. log
ecoa $?
Pesquisas recursivas com grep
Para pesquisar 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, deve fornecer um caminho. Aqui nós estamos pesquisando no diretório atual "“." e quaisquer subdiretórios:
grep -r -i sem memória.
A saída inclui o diretório e o nome do arquivo de cada linha correspondente.
Podemos fazer com que o grep siga os links simbólicos usando a opção -R (desreferência recursiva). Temos um link simbólico nesse diretório, chamado pasta de logs. Aponta para / home / dave / logs.
ls -l pasta de logs
Vamos repetir nossa última pesquisa com a opção -R (desreferência recursiva):
grep -R -i sem memória.
O link simbólico é seguido e o diretório para o qual ele aponta também é pesquisado por grep.
Pesquisando 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
Os resultados são linhas que têm a string 'livre' ” neles, mas eles não são palavras separadas. Eles são parte da string MemFree.
Para forçar o grep a corresponder a palavras separadas “ somente, use a opção -w (word regexp).
grep -w -i livre geek-1. log
ecoa $?
Desta vez, não há resultados porque o termo de pesquisa "gratuito" ” não aparece no arquivo como uma palavra separada.
Usando vários termos de pesquisa
A opção -E (extensão regular de expressão regular) permite pesquisar várias palavras. (A opção -E substitui a versão obsoleta do 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 procurar por 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 usar vários termos de pesquisa na linha de comando. Estamos usando o recurso de colchete de expressão regular para criar um padrão de pesquisa. Diz ao grep para coincidir com qualquer um dos caracteres contidos entre colchetes "# [8220; []." ” Isso significa que o grep corresponderá a “ kB ” ou “ KB ” enquanto procura.
Ambas as strings são correspondentes e, de fato, algumas linhas contêm as duas strings.
Correspondência exata de linhas
-x (linha regexp) corresponderá apenas às linhas em que a linha inteira corresponder 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 correspondente é encontrada e exibida.
O oposto disso mostra apenas as linhas que não correspondem. Isso pode ser útil quando você estiver vendo arquivos de configuração. Os comentários são ótimos, mas às vezes é difícil identificar as configurações reais entre todas elas. Aqui está o arquivo / etc / sudoers:
Podemos filtrar efetivamente as linhas de comentário 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 deseja ver a linha correspondente inteira, apenas o texto correspondente. A opção -o (apenas correspondente) 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, também pode fornecer informações numéricas. Podemos fazer com que o grep conte 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 (count).
grep -c geek-1. log médio
grep informa que o termo de pesquisa aparece 240 vezes neste arquivo.
Você pode fazer o grep exibir o número da linha correspondente a 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 correspondente geralmente é útil. pode ajudar a distinguir em quais linhas correspondentes são as de seu interesse.
Para mostrar algumas linhas após a linha correspondente, use a opção -A (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 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 (context).
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 estã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 estão no início ou no final de uma linha. O “ ^ ” O operador de expressão regular corresponde ao início de uma linha. Praticamente todas as linhas no arquivo de log conterão espaços, mas vamos procurar por linhas que tenham um espaço como primeiro caractere:
grep "^" geek-1. log
As linhas que têm 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 procurar por linhas que terminem com "8220; 00." ”
grep "00 $" geek-1. log
O visor mostra as linhas que possuem “ 00 ” como seus personagens finais.
Usando pipes com grep
É claro que 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 canais.
Digamos que queremos ver todas as ocorrências da string "ExtractParameters" ” em nossos arquivos de código-fonte C. Sabemos que haverá muito poucos, então canalizamos a saída em menos:
grep "ExtractParameters" * .c | menos
A saída é apresentada em menos.
Permite folhear a lista de arquivos e usar o recurso de pesquisa de less.
Se canalizarmos a saída do grep para o wc e usarmos a opção -l (linhas), poderemos contar o número de linhas nos arquivos de código-fonte que contêm o “ ExtractParameters ”. (Podemos conseguir isso usando a opção grep-c (count), mas esta é uma maneira interessante de demonstrar a saída 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 do grep para a classificação. 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 "agosto" | classificar + 4n
Vamos decompor isso:
- ls -l: executa uma lista de arquivos em formato longo usando ls.
- grep “ agosto ”: Selecione as linhas da lista ls que possui “ Ago ” neles. Observe que isso também encontraria arquivos com o "Ago" de agosto de ” em seus nomes.
- sort + 4n: classifique a saída do grep na quarta coluna (tamanho do arquivo).
Recebemos uma lista ordenada de todos os arquivos modificados em agosto (independentemente do ano), em ordem crescente de tamanho.
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 faz, e nada faz melhor.
Acoplar grep com algumas expressões regulares-fu realmente leva ao próximo nível.
RELACIONADO: Como usar expressões regulares básicas para pesquisar melhor e economizar tempo
Via: How to Geek
Nenhum comentário