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 -q
switch, mas isso suprimiria a saída completa, o que eu não quero.
Como faço isso?
grep
não deve imprimir nomes de arquivos não correspondentes. Na verdade, parece quegrep
considera uma linha com o conteúdo0
correspondente. Você pode postar o padrão exato de pesquisa que está usando?grep 'delete' * -R
, mas acho que não-R
está causando nenhum problema. E sim, ele normalmente não imprime os não correspondentes, mas não sei o que é o caso aqui ...grep -- 'delete' *
(adicionado--
) e funcionou como esperado. A remoção do--
está levando à tela acima.-ci
. Obrigado por resolver o problema. Você pode postar esse cenário como resposta.Respostas:
Esse é o comportamento exibido por
grep -c
.Provavelmente você tem um arquivo cujo nome começa com
-
e contém umc
caractere e você está usando o GNU grep sem definir aPOSIXLY_CORRECT
variável de ambiente.Usar:
ou melhor:
--
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 odelete
argumento de não-opção teria marcado o final das opções), mas não resolveria o problema de um arquivo chamado-
. Ogrep 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).fonte
Adicionar
Não é muito elegante, mas acho que fará o trabalho.
A adição
-l
ao seu comando fornecerá apenas correspondências, mas também suprimirá o número de impressões correspondentes a cada arquivo.fonte
-l
trabalhou. a solução alternativa também é boa. Graçasgrep -v ':0$'
tão somente aqueles no final de uma linha são combinados (no entanto, agrep -l
abordagem é muito melhor desde que você não precisa de contas de linha)Se
grep -l
você 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
-c
que é usado para contar o número de correspondências em um arquivo.edit: E como o warlock disse que usar
-I
para suprimir correspondências em arquivos binários também pode ser uma boa idéia.fonte
Como grep contagens diferentes de zero:
grep -rIcH 'string' . | grep -v ':0$'
-r
Subdirecionar subdiretórios.-I
Ignore arquivos binários (obrigado @tongpu , warlock) .-c
Mostrar 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.)
fonte
Semelhante à resposta de Laurentiu, você também pode usar a lista de
-l
como 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
fonte