grep como suprimir a exibição de arquivos não correspondentes?

11

Estou tentando encontrar arquivos que contenham uma palavra específica usando grep. Existem muitos arquivos no diretório (> 500)

Comando que eu corro

$ grep 'delete' *

Resultado

validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines

Esses são os arquivos que não contêm a correspondência especificada. Quero suprimir essas linhas da exibição para stdout. Eu sei do -qswitch, mas isso suprimiria a saída completa, o que eu não quero.

Como faço isso?

mtk
fonte
2
Normalmente, grepnão deve imprimir nomes de arquivos não correspondentes. Na verdade, parece que grepconsidera uma linha com o conteúdo 0correspondente. Você pode postar o padrão exato de pesquisa que está usando?
Adrian Heine
O cmd completo do grep que usei foi grep 'delete' * -R, mas acho que não -Restá causando nenhum problema. E sim, ele normalmente não imprime os não correspondentes, mas não sei o que é o caso aqui ...
mtk
@step @everyone .. Estranho ... Depois de ver o post editado acima. Eu tentei grep -- 'delete' *(adicionado --) e funcionou como esperado. A remoção do --está levando à tela acima.
mtk
1
@ Stephanie De fato, você está correto. Eu procurei no dir ... e havia um arquivo com o nome -ci. Obrigado por resolver o problema. Você pode postar esse cenário como resposta.
mtk

Respostas:

9

Esse é o comportamento exibido por grep -c.

Provavelmente você tem um arquivo cujo nome começa com -e contém um ccaractere e você está usando o GNU grep sem definir a POSIXLY_CORRECTvariável de ambiente.

Usar:

grep -- delete *

ou melhor:

grep delete ./*

--marca o final das opções para que esse nome de arquivo não seja considerado uma opção (com um grep POSIX, não seria, pois o deleteargumento de não-opção teria marcado o final das opções), mas não resolveria o problema de um arquivo chamado -. O grep delete ./*é mais robusto, mas tem a desvantagem de gerar o extra ./para arquivos correspondentes (embora isso possa ser considerado um bônus, pois ajuda a identificar nomes de arquivos que contêm caracteres de nova linha).

Stéphane Chazelas
fonte
12

Adicionar

| grep -v ':0$'

Não é muito elegante, mas acho que fará o trabalho.

A adição -lao seu comando fornecerá apenas correspondências, mas também suprimirá o número de impressões correspondentes a cada arquivo.

Laurentiu Roescu
fonte
1
-ltrabalhou. a solução alternativa também é boa. Graças
mtk
4
a linha grep deve ser grep -v ':0$'tão somente aqueles no final de uma linha são combinados (no entanto, a grep -labordagem é muito melhor desde que você não precisa de contas de linha)
mreithub
9

Se grep -lvocê usar apenas os arquivos que contêm pelo menos uma correspondência.

Você precisa de informações sobre quantas correspondências existem em um arquivo? Porque você pode pular usando o -cque é usado para contar o número de correspondências em um arquivo.

edit: E como o warlock disse que usar -Ipara suprimir correspondências em arquivos binários também pode ser uma boa idéia.

tongpu
fonte
0

Como grep contagens diferentes de zero:

grep -rIcH 'string' . | grep -v ':0$'

  • -r Subdirecionar subdiretórios.
  • -IIgnore arquivos binários (obrigado @tongpu , warlock) .
  • -cMostrar contagem de correspondências. Irritantemente, inclui arquivos de contagem 0.
  • -H Mostra o nome do arquivo, mesmo que apenas um arquivo.
  • 'string' sua corda vai aqui.
  • . Comece no diretório atual.
  • | -v ':0$'Remova os arquivos de contagem 0. (obrigado @LaurentiuRoescu )

(Eu percebo que o OP estava involuntariamente -c contando, mas o google (grep diferente de zero) chega aqui.)

Bob Stein
fonte
0

Semelhante à resposta de Laurentiu, você também pode usar a lista de -lcomo entradas de arquivo para grep:
grep -r "pattern" -c $(grep -rl "pattern")
Permite manter a coloração de grep, mas faz a mesma coisa em segundo plano

Adriel
fonte
observe que os nomes de arquivos e diretórios que contêm espaços em branco ou curingas serão divididos e correspondidos por engano.
Jeff Schaller