Comment exclure un mot avec grep?

467

J'ai besoin de quelque chose comme:

grep ^"unwanted_word"XXXXXXXX
John
la source
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Kanagavelu Sugumar

Réponses:

802

Vous pouvez le faire en utilisant l' option -v(for --invert-match) de grep comme:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" filefiltrera les lignes qui ont le unwanted_wordet grep XXXXXXXXlistera uniquement les lignes avec motif XXXXXXXX.

ÉDITER:

D'après votre commentaire, il semble que vous souhaitiez répertorier toutes les lignes sans le unwanted_word. Dans ce cas, il vous suffit de:

grep -v 'unwanted_word' file
codaddict
la source
2
que se passe-t-il si je veux également exclure N lignes après la ligne avec "mot indésirable"? -v 'unwanted_word' --after Nn'aide pas car il comprend la ligne et N lignes après.
Andrey Regentov
-vou --invert-matchsélectionnez des lignes qui ne correspondent pas. Dans votre cas grep -v 'unwanted_word' fileou grep --invert-match 'unwanted_word' file.
adamski.pro
Je veux ignorer une ligne au-dessus et une ligne ci-dessous avec un motif correspondant. Comment puis-je y parvenir?
Kanji Viroja
Génial, je l'utilise dans git pour parcourir rapidement le statut de mon repo, fonctionne comme un charme:git status -s |grep -v "folder_I_dont_care"
benjaminz
3
Bizarre, c'est la meilleure réponse, mais dans certains cas, c'est faux! Si je veux trouver sun, sauf quand c'est le cas sunrise, une grep sun|grep -v sunriseligne qui contient les deux sunet sunriseà la fois, ce n'est pas ce que je veux. grep -P 'sun(?!rise)'c'est beaucoup mieux.
greene
86

J'ai compris la question comme "Comment faire correspondre un mot mais en exclure un autre", pour lequel une solution est deux greps en série: Premier grep trouvant le "word1" recherché, second grep excluant "word2":

grep "word1" | grep -v "word2"

Dans mon cas: j'ai besoin de faire la différence entre "plot" et "#plot", ce que l'option "word" de grep ne fera pas ("#" n'étant pas alphanumérique).

J'espère que cela t'aides.

JPGConnolly
la source
16
Vous devez inverser l'ordre pour mettre en surbrillance word1.
Matthew Read
1
Je suppose que cela clarifierait d'ajouter un espace réservé pour le nom de fichier à cet exemple
patrick
39

Si votre grepprend en charge l'expression régulière Perl avec -Poption, vous pouvez le faire (si bash; si tcsh vous devrez échapper au !):

grep -P '(?!.*unwanted_word)keyword' file

Démo:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

Laissez-nous maintenant énumérer tout foosauffoo3

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 
codaddict
la source
Merci pour cela, très utile! Je voudrais mentionner que la commande grep est sensible à la casse par défaut
DocWiki
2
Notez que cela grep -v -Pfonctionne également sans négation dans l'expression régulière.
cybersoft
"Si bash ... vous devrez vous échapper !" . Merci merci merci! Voilà ce que je voulais!
Gabriel Staples
36

La bonne solution est d'utiliser grep -v "word" file, avec son awkéquivalent:

awk '!/word/' file

Cependant, s'il vous arrive d'avoir une situation plus complexe dans laquelle vous voulez, disons, XXXapparaître et YYY ne pas apparaître, alors cela awkest pratique au lieu de passer plusieurs greps:

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

Vous pouvez même dire quelque chose de plus complexe. Par exemple: je veux ces lignes contenant soit XXXou YYY, mais pas ZZZ:

awk '(/XXX/ || /YYY/) && !/ZZZ/' file

etc.

fedorqui 'SO arrête de nuire'
la source
2
Il semble être beaucoup plus rapide que la grep -Psolution sur les gros fichiers.
MBR
@MBR grep -Psignifie utiliser Perl regexp, donc le chargement de ce paquet sera beaucoup plus cher qu'une normale grep.
fedorqui 'SO arrête de nuire'
10

Inverser la correspondance en utilisant grep -v:

grep -v "unwanted word" file pattern
garima
la source
6

grep fournit l'option '-v' ou '--invert-match' pour sélectionner les lignes qui ne correspondent pas.

par exemple

grep -v 'unwanted_pattern' file_name

Cela affichera toutes les lignes du fichier nom_fichier, qui n'a pas de "motif indésirable".

Si vous recherchez le modèle dans plusieurs fichiers à l'intérieur d'un dossier, vous pouvez utiliser l'option de recherche récursive comme suit

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

Ici, grep essaiera de lister toutes les occurrences de 'Want_pattern' dans tous les fichiers du répertoire actuel et le passera au second grep pour filtrer le 'unwanted_pattern'. «|» - pipe dira au shell de connecter la sortie standard du programme gauche (grep -r 'Want_pattern' *) à l'entrée standard du programme droit (grep -v 'unwanted_pattern').

Shriganesh Shintre
la source
4

L' -voption vous montrera toutes les lignes qui ne correspondent pas au motif.

grep -v ^unwanted_word
st0le
la source
-5

J'ai un répertoire avec un tas de fichiers. Je veux trouver tous les fichiers qui ne contiennent pas la chaîne "speedup", j'ai donc utilisé avec succès la commande suivante:

grep -iL speedup *
pjrieger
la source
1
À partir de la page de manuel: "-L, --files-without-match Supprime la sortie normale; au lieu de cela, imprime le nom de chaque fichier d'entrée à partir duquel aucune sortie n'aurait normalement été imprimée. L'analyse s'arrêtera à la première correspondance. " (Souligné par moi) Alors méfiez-vous de cela!
xuiqzy