Como excluir padrões, arquivos e diretórios com grep

Como excluir padrões, arquivos e diretórios com grep

Desde 1974, a equipe do Linux grepajuda as pessoas a encontrar linhas em arquivos. Mas às vezes grepcom muito cuidado. Aqui estão algumas maneiras de dizer grepignorar coisas diferentes.

comando grep

O comando greppesquisa em arquivos de texto as linhas que correspondem aos padrões de pesquisa especificados na linha de comando. O poder grepestá 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 ededitor de linha (pronuncia-se “ee-dee” a propósito). Isso significava uma pesquisa global e regular expressa, imprimindo linhas correspondentes.

grepconhecido – 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, grepvocê 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 -vopçã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 -eopçã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 -Eopção (expressões regulares estendidas), podemos combinar padrões de busca com ” |“, que neste contexto não indica um canal, é um ORoperador 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

grepPara 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 grepprocurar 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 --excludeopçã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 -Ropção (dereference-recursive), grepela 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 --excludeparâ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-dirparâ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-diropçã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

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *