Categories: Tecnologia

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

Desde 1974, o comando Linuxgrep tem ajudado as pessoas a encontrar strings em arquivos. Mas às vezes grepé muito completo. Aqui estão várias maneiras de grepignorar coisas diferentes.

O comando grep

O grepcomando pesquisa arquivos de texto em busca de strings que correspondam aos padrões de pesquisa fornecidos na linha de comando. O poder do grepestá no uso de expressões regulares. Eles permitem que você descreva o que procura, em vez de precisar defini-lo explicitamente.

O nascimento do grepLinux é anterior. foi desenvolvido no início dos anos 1970 em Unix. Seu nome vem da sequência de teclas g/re/p no

 ed 

editor de linha (aliás, pronunciado “ee-dee”). Isso significava  pesquisa expressa  globalregular , linhas de correspondência de impressão .

grepé notoriamente—talvez, notoriamente—completo e obstinado. Às vezes, ele pesquisa arquivos ou diretórios com os quais você prefere não perder tempo, porque os resultados podem fazer com que você não consiga ver a madeira das árvores.

Claro, existem maneiras de controlar o grep. Você pode instruí-lo a ignorar padrões, arquivos e diretórios para que o grep conclua suas pesquisas mais rapidamente e você não seja inundado com falsos positivos sem sentido.

Excluindo Padrões

Para pesquisar, grepvocê pode canalizar a entrada de algum outro processo, como

 cat 

ou você pode fornecer um nome de arquivo como o último parâmetro da linha de comando.

Estamos usando um pequeno arquivo que contém o texto do poema  Jabberwocky , de Lewis Carroll. Nestes dois exemplos, estamos procurando linhas que correspondam ao termo de pesquisa “Jabberwock”.

gato jabberwocky.txt | grep "Jabberwock"

grep "Jabberwock" jabberwocky.text

As linhas que contêm correspondências com a pista de pesquisa são listadas para nós, com o elemento correspondente em cada linha destacado em vermelho. Essa é uma pesquisa simples. Mas e se quisermos excluir as linhas que contêm a palavra “Jabberwock” e imprimir o resto?

Podemos fazer isso com a -vopção (inverter correspondência). Isso lista as linhas que não correspondem ao termo de pesquisa.

grep -v "Jabberwock" jabberwocky.text

As linhas que não contêm “Jabberwock” são listadas na janela do terminal.

Podemos excluir quantos termos desejarmos. Vamos filtrar todas as linhas que contenham “Jabberwock” e todas as linhas que contenham “e”. Para conseguir isso usaremos a -eopção (expressão). Precisamos usá-lo para cada padrão de pesquisa que estivermos usando.

grep -v -e "Jabberwock" -e "e" jabberwocky.txt

Há uma queda correspondente no número de linhas na saída.

Se usarmos a opção -E(extended regexes ), podemos combinar os padrões de pesquisa com ” |“, que neste contexto não indica um pipe, é o ORoperador lógico.

grep -Ev "Jabberwock | e" jabberwocky.txt

Obtemos exatamente a mesma saída que obtivemos com o comando anterior, mais prolixo.

O formato do comando é o mesmo se você quiser usar um padrão regex em vez de uma pista de pesquisa explícita. Este comando excluirá todas as linhas que começam com qualquer letra no conjunto “ACHT”.

grep -Ev "^ACHT" jabberwocky.txt

Para ver linhas que contêm um padrão, mas que também não contêm outro padrão, podemos canalizar greppara grep. Procuraremos todas as linhas que contenham a palavra “Jabberwock” e, em seguida, filtraremos todas as linhas que também contenham a palavra “slain”.

grep "Jabberwock" jabberwocky.txt | grep -v "morto"

Excluindo arquivos

Podemos pedir greppara procurar uma string ou padrão em uma coleção de arquivos. Você poderia listar cada arquivo na linha de comando, mas com muitos arquivos essa abordagem não é escalonável.

grep "vorpal" verso-1.txt verso-2.txt verso-3.txt verso-4.txt verso-5.txt verso-6.txt

Observe que o nome do arquivo que contém a linha correspondente é exibido no início de cada linha de saída.

Para reduzir a digitação, podemos usar curingas. Mas isso pode ser contra-intuitivo. Isso parece funcionar.

grep "vorpal" *.txt

Porém, neste diretório existem outros arquivos TXT, sem nada a ver com o poema. Se procurarmos a palavra “espada” com a mesma estrutura de comando, obteremos muitos falsos positivos.

grep "espada" *.txt

Os resultados que desejamos são mascarados pelo dilúvio de resultados falsos de outros arquivos que possuem a extensão TXT.

A palavra “vorpal” não correspondia a nada, mas “espada” está incluída na palavra “senha”, por isso foi encontrada muitas vezes em alguns pseudo-arquivos de log.

Precisamos excluir esses arquivos. Para fazer isso usaremos a --excludeopção. Para excluir um único arquivo chamado “vol-log-1.txt”, usaríamos este comando:

grep --exclude=vol-log-1.txt "espada" *.txt

Neste caso, queremos excluir vários arquivos de log com nomes que começam com “vol”. A sintaxe que precisamos é:

grep --exclude=vol*.txt "espada" *.txt

Quando usamos a -Ropção (desreferência-recursiva) grepirá pesquisar árvores de diretórios inteiras para nós. Por padrão, ele pesquisará todos os arquivos nesses locais. Pode muito bem haver vários tipos de arquivos que desejamos excluir.

Abaixo do diretório atual nesta máquina de teste, existem diretórios aninhados contendo arquivos de log, arquivos CSV e arquivos MD. Todos esses são tipos de arquivos de texto que queremos excluir. Poderíamos usar uma --excludeopção para cada tipo de arquivo, mas podemos conseguir o que queremos de forma mais eficiente agrupando os tipos de arquivo.

Este comando exclui todos os arquivos que possuem extensões CSV ou MD e todos os arquivos TXT cujos nomes começam com “vol” ou “log”.

grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "espada" /home/dave/data/

Excluindo diretórios

Se os arquivos que queremos ignorar estiverem contidos em diretórios e não houver arquivos nesses diretórios que desejamos pesquisar, podemos excluir esses diretórios inteiros.

O conceito é muito semelhante ao de exclusão de arquivos, exceto que usamos a --exclude-diropção 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 pesquisando em outro diretório chamado “backup2”.

Não será nenhuma surpresa que possamos usar a --exclude-diropção várias vezes em um único comando. Observe que o caminho para os diretórios excluídos deve ser fornecido em relação ao diretório em que a pesquisa será iniciada. Não use o 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 conseguir a mesma coisa de forma mais sucinta com:

grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data

Você pode combinar exclusões de arquivos e diretórios no mesmo comando. Se você deseja excluir todos os arquivos de um diretório e excluir determinados tipos de arquivos dos diretórios pesquisados, use esta sintaxe:

grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data

Às vezes é o que você deixa de fora

Às vezes, greppode parecer que você está tentando encontrar uma agulha em um palheiro. faz uma grande diferença tirar o palheiro.

maisroot

Recent Posts

O novo aplicativo “PC Manager” da Microsoft se parece muito com o CCleaner

Muitos aplicativos de limpeza estão disponíveis para Windows ao longo dos anos, mas hoje em…

1 ano ago

Como reiniciar um PS4

Seu PlayStation 4 está congelado? Seus jogos favoritos continuam travando? Reiniciar seu PS4 pode resolver…

1 ano ago

Veja por que as reticências são tão assustadoras ao enviar mensagens de texto…

A popularidade das mensagens de texto significou aprender uma forma totalmente nova de comunicação. Você…

1 ano ago

O telescópio James Webb acaba de capturar os “Pilares da Criação”

A foto dos "Pilares da Criação" tirada pelo Telescópio Espacial Hubble é uma das fotos…

1 ano ago

Você poderá baixar o Proton Drive mais cedo do que pensa

O Proton Drive saiu de seu estágio beta há algumas semanas, mas o aplicativo real…

1 ano ago

Como aumentar o zoom no Photoshop

Para ver suas fotos mais de perto ou para uma edição precisa , você pode…

1 ano ago