Como excluir padrões, arquivos e diretórios com grep
Desde 1974, a equipe do Linux grep
ajuda as pessoas a encontrar linhas em arquivos. Mas às vezes grep
com muito cuidado. Aqui estão algumas maneiras de dizer grep
ignorar coisas diferentes.
comando grep
O comando grep
pesquisa em arquivos de texto as linhas que correspondem aos padrões de pesquisa especificados na linha de comando. O poder grep
está no uso de expressões regulares. Eles permitem que você descreva o que está procurando em vez de defini-lo explicitamente.
O nascimento grep
é anterior ao Linux. foi desenvolvido no início dos anos 1970 para Unix. Ele recebe seu nome da sequência de teclas g/re/p no ed
editor de linha (pronuncia-se “ee-dee” a propósito). Isso significava uma pesquisa global e regular expressa, imprimindo linhas correspondentes.
grep
conhecido – talvez notório – por ser meticuloso e obstinado. Às vezes, ele procurará arquivos ou diretórios nos quais você preferiria não perder tempo, porque os resultados podem impossibilitar que você veja a floresta para as árvores.
Claro, existem maneiras de controlar o grep. Você pode dizer a ele para ignorar padrões, arquivos e diretórios para que o grep pesquise mais rapidamente e você não seja inundado com falsos positivos sem sentido.
Exclusão de padrão
Para pesquisar, grep
você pode direcionar a entrada para ele de algum outro processo, como cat
, ou pode especificar um nome de arquivo como o último argumento da linha de comando.
Estamos usando um pequeno arquivo contendo o texto do poema Jabberwocky de Lewis Carroll. Nestes dois exemplos, estamos procurando por strings que correspondam ao termo de pesquisa “jabberwock”.
cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock"jabberwocky.text
As linhas que contêm correspondências com uma dica de pesquisa são listadas para nós, com o item correspondente em cada linha destacado em vermelho. Esta é uma pesquisa direta. Mas e se quisermos excluir as linhas que contêm a palavra “Jabberwock” e imprimir o resto?
Podemos conseguir isso com a -v
opção (invert match). Isso lista as strings que não correspondem à consulta de pesquisa.
grep -v "Jabberwock"jabberwocky.text
As linhas que não contêm “Jabmaglot” são exibidas na janela do terminal.
Podemos excluir quantos termos desejarmos. Vamos filtrar todas as linhas contendo “Jabberwock” e todas as linhas contendo “e”. Para isso usaremos uma -e
opção (expressão). Precisamos usá-lo para cada padrão de pesquisa que usamos.
grep -v -e "Jabberwock"-e "and"jabberwocky.txt
Uma diminuição correspondente no número de linhas na saída.
Se usarmos a -E
opção (expressões regulares estendidas), podemos combinar padrões de busca com ” |
“, que neste contexto não indica um canal, é um OR
operador lógico.
grep -Ev "Jabberwock|and"jabberwocky.txt
Obtemos exatamente a mesma saída do comando anterior, mais longo.
O formato do comando é o mesmo se você quiser usar um padrão de expressão regular em vez de uma dica de pesquisa explícita. Este comando excluirá todas as linhas que começam com qualquer letra do conjunto “ACHT”.
grep -Ev "^ACHT"jabberwocky.txt
grep
Para ver linhas que contêm um padrão, mas não outro padrão , podemos passar grep
. Procuraremos todas as linhas que contenham a palavra “jabberwock” e, em seguida, filtraremos todas as linhas que também contenham a palavra “killed”.
grep "Jabberwock"jabberwocky.txt | grep -v "slain"
Exclusão de arquivo
Podemos pedir para grep
procurar uma string ou padrão em um conjunto de arquivos. Você pode listar cada arquivo na linha de comando, mas com muitos arquivos essa abordagem não é dimensionada.
grep "vorpal"verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt
Observe que o nome do arquivo que contém a linha correspondente aparece no início de cada linha de saída.
Para encurtar a entrada, podemos usar curingas. Mas isso pode ser contra-intuitivo. Parece funcionar.
grep "vorpal"*.txt
No entanto, existem outros arquivos TXT neste diretório que não têm nada a ver com o poema. Se pesquisarmos a palavra “espada” com a mesma estrutura de comando, obteremos muitos falsos positivos.
grep "sword"*.txt
Os resultados de que precisamos são mascarados por um fluxo de resultados falsos de outros arquivos TXT.
A palavra “vorpal” não correspondia a nada, mas a palavra “espada” está incluída na palavra “senha”, por isso apareceu muitas vezes em alguns arquivos de pseudo-log.
Precisamos excluir esses arquivos. Para isso, usamos a --exclude
opção. Para excluir um arquivo chamado “vol-log-1.txt”, usaríamos este comando:
grep --exclude=vol-log-1.txt "sword"*.txt
Nesse caso, queremos excluir vários arquivos de log com nomes começando com “vol”. A sintaxe que precisamos é:
grep --exclude=vol*.txt "sword"*.txt
Quando usamos a -R
opção (dereference-recursive), grep
ela pesquisará todas as árvores de diretórios para nós. Por padrão, ele procurará todos os arquivos nesses locais. Pode haver vários tipos de arquivos que queremos excluir.
Sob o diretório atual nesta máquina de teste, existem subdiretórios contendo arquivos de log, arquivos CSV e arquivos MD. Esses são todos os tipos de arquivos de texto que queremos excluir. Poderíamos usar um --exclude
parâmetro para cada tipo de arquivo, mas podemos conseguir o que queremos com mais eficiência agrupando os tipos de arquivo.
Este comando exclui todos os arquivos com extensões .csv ou .md, bem como todos os arquivos .txt cujos nomes começam com “vol” ou “log”.
grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword"/home/dave/data/
Excluindo diretórios
Se os arquivos que queremos ignorar estiverem contidos em diretórios e esses diretórios não contiverem os arquivos que queremos encontrar, podemos excluir esses diretórios completamente.
O conceito é muito parecido com a exclusão de arquivos, exceto que usamos um --exclude-dir
parâmetro e nomeamos os diretórios a serem ignorados.
grep -R --exclude-dir=backup "vorpal"/home/dave/data
Excluímos o diretório “backup”, mas ainda estamos procurando em outro diretório chamado “backup2”.
Não surpreendentemente, podemos usar essa --exclude-dir
opção várias vezes no mesmo comando. Observe que o caminho para os diretórios excluídos deve ser relativo ao diretório em que a pesquisa será iniciada. Não use um caminho absoluto da raiz do sistema de arquivos.
grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal"/home/dave/data
Também podemos usar agrupamentos. Podemos obter o mesmo resultado de forma mais concisa:
grep -R --exclude-dir={backup,backup2} "vorpal"/home/dave/data
Você pode combinar exclusões de arquivos e diretórios em um comando. Se você deseja excluir todos os arquivos de um diretório e excluir determinados tipos de arquivos dos diretórios de pesquisa, use esta sintaxe:
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious"/home/dave/data
Deixe um comentário