grep comment supprimer l'affichage d'un fichier non apparié?

11

J'essaie de trouver des fichiers contenant un mot spécifique en utilisant grep. Il y a beaucoup de fichiers dans le répertoire (> 500)

Commande que j'exécute

$ grep 'delete' *

Production

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

Ce sont les fichiers qui ne contiennent pas la correspondance donnée. Je veux supprimer ces lignes de l'affichage à stdout. Je connais le -qcommutateur, mais cela supprimerait la sortie complète, ce que je ne veux pas.

Comment je fais ça?

mtk
la source
2
Normalement, grepne doit pas imprimer les noms de fichiers des fichiers non correspondants. En fait, il ressemble à grepune ligne dont le contenu 0correspond. Pouvez-vous publier le modèle de recherche exact que vous utilisez?
Adrian Heine
La cmd grep complète que j'ai utilisée était grep 'delete' * -R, mais je ne pense pas que cela -Rcause de problème. Et oui, il n'imprime normalement pas ceux qui ne correspondent pas, mais
je
@step @everyone .. Strange ... Après avoir vu le post édité ci-dessus. J'ai essayé grep -- 'delete' *(ajouté --) et cela a fonctionné comme prévu. La suppression du --conduit à l'affichage ci-dessus.
mtk
1
@Stephane En effet, vous avez raison. J'ai recherché le répertoire ... et il y avait un fichier avec le nom -ci. Merci d'avoir résolu le problème. Vous pouvez publier ce scénario comme réponse.
mtk

Réponses:

9

C'est le comportement manifesté par grep -c.

Vous avez probablement un fichier dont le nom commence par -et contient un ccaractère et vous utilisez GNU grep sans définir la POSIXLY_CORRECTvariable d'environnement.

Utilisation:

grep -- delete *

ou mieux:

grep delete ./*

--marque la fin des options afin que ce nom de fichier ne soit pas considéré comme une option (avec un grep POSIX, ce ne serait pas le cas puisque l' deleteargument non-option aurait marqué la fin des options), mais il ne résoudrait pas le problème de un fichier appelé -. Le grep delete ./*est plus robuste mais présente l'inconvénient de produire le supplément ./pour les fichiers correspondants (bien que cela puisse être considéré comme un bonus car cela permet d'identifier les noms de fichiers qui contiennent des caractères de nouvelle ligne).

Stéphane Chazelas
la source
12

Ajouter

| grep -v ':0$'

Pas très élégant mais je pense qu'il fera l'affaire.

L'ajout -là votre commande ne vous donnera que des correspondances mais cela supprimera également l'impression du nombre de correspondances pour chaque fichier.

Laurentiu Roescu
la source
1
-ltravaillé. la solution de contournement est également bonne. Merci
mtk
4
la ligne de grep devrait être grep -v ':0$'si seules celles à la fin d'une ligne sont mises en correspondance (cependant, l' grep -lapproche est bien meilleure tant que vous n'avez pas besoin du nombre de lignes)
mreithub
9

L' utilisation , grep -lvous n'obtiendrez les fichiers qui contiennent au moins un match.

Avez-vous besoin d'informations sur le nombre de correspondances dans un fichier? Parce que vous pouvez ignorer l'utilisation de -cce qui est utilisé pour compter le nombre de correspondances dans un fichier.

edit: Et comme le dit le démoniste, utiliser -Ipour supprimer les correspondances dans les fichiers binaires pourrait également être une bonne idée.

tongpu
la source
0

Comment grep des nombres non nuls:

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

  • -r Sous-répertoires Recurse.
  • -IIgnorez les fichiers binaires (merci @tongpu , warlock) .
  • -cAfficher le nombre de correspondances. De façon ennuyeuse, comprend des fichiers à 0 compte.
  • -H Afficher le nom du fichier, même si un seul fichier.
  • 'string' votre chaîne va ici.
  • . Commencez à partir du répertoire actuel.
  • | -v ':0$'Supprimez les fichiers à 0 décompte. (merci @LaurentiuRoescu )

(Je me rends compte que l'OP comptait involontairement -c, mais google (nombre grep non nul) atterrit ici.)

Bob Stein
la source
0

Semblable à la réponse de Laurentiu, vous pouvez également utiliser la liste de -lcomme entrées de fichier pour grep:
grep -r "pattern" -c $(grep -rl "pattern")
il permet de conserver la coloration de grep, mais fait la même chose en arrière-plan

adriel
la source
notez que les noms de fichiers et répertoires qui contiennent des espaces ou des caractères génériques seront divisés par erreur et mis en correspondance en conséquence.
Jeff Schaller