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 -q
commutateur, mais cela supprimerait la sortie complète, ce que je ne veux pas.
Comment je fais ça?
grep
ne doit pas imprimer les noms de fichiers des fichiers non correspondants. En fait, il ressemble àgrep
une ligne dont le contenu0
correspond. Pouvez-vous publier le modèle de recherche exact que vous utilisez?grep 'delete' * -R
, mais je ne pense pas que cela-R
cause de problème. Et oui, il n'imprime normalement pas ceux qui ne correspondent pas, maisgrep -- 'delete' *
(ajouté--
) et cela a fonctionné comme prévu. La suppression du--
conduit à l'affichage ci-dessus.-ci
. Merci d'avoir résolu le problème. Vous pouvez publier ce scénario comme réponse.Réponses:
C'est le comportement manifesté par
grep -c
.Vous avez probablement un fichier dont le nom commence par
-
et contient unc
caractère et vous utilisez GNU grep sans définir laPOSIXLY_CORRECT
variable d'environnement.Utilisation:
ou mieux:
--
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'delete
argument non-option aurait marqué la fin des options), mais il ne résoudrait pas le problème de un fichier appelé-
. Legrep 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).la source
Ajouter
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.la source
-l
travaillé. la solution de contournement est également bonne. Mercigrep -v ':0$'
si seules celles à la fin d'une ligne sont mises en correspondance (cependant, l'grep -l
approche est bien meilleure tant que vous n'avez pas besoin du nombre de lignes)L' utilisation ,
grep -l
vous 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
-c
ce qui est utilisé pour compter le nombre de correspondances dans un fichier.edit: Et comme le dit le démoniste, utiliser
-I
pour supprimer les correspondances dans les fichiers binaires pourrait également être une bonne idée.la source
Comment grep des nombres non nuls:
grep -rIcH 'string' . | grep -v ':0$'
-r
Sous-répertoires Recurse.-I
Ignorez les fichiers binaires (merci @tongpu , warlock) .-c
Afficher 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.)
la source
Semblable à la réponse de Laurentiu, vous pouvez également utiliser la liste de
-l
comme 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
la source