web-dev-qa-db-fra.com

Comment puis-je exclure un mot avec grep?

J'ai besoin de quelque chose comme:

grep ^"unwanted_Word"XXXXXXXX
410
john

Vous pouvez aussi le faire en utilisant l’option -v (pour --invert-match) de grep comme:

grep -v "unwanted_Word" file | grep XXXXXXXX

grep -v "unwanted_Word" file va filtrer les lignes ayant le unwanted_Word et grep XXXXXXXX ne listera que les lignes avec le motif XXXXXXXX.

EDIT:

D'après votre commentaire, il semble que vous souhaitiez répertorier toutes les lignes sans le unwanted_Word. Dans ce cas, tout ce dont vous avez besoin est:

grep -v 'unwanted_Word' file
713
codaddict

J'ai compris la question comme suit: "Comment faire pour correspondre à un mot mais en exclure un autre", pour lequel une solution est constituée de deux greps en série: le premier grep trouvant le "mot1" recherché, le second excluant "le mot2":

grep "Word1" | grep -v "Word2"

Dans mon cas: je dois 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.

77
JPGConnolly

Si votre grep prend en charge l'expression régulière Perl avec l'option -P, vous pouvez le faire (si bash; si tcsh, vous aurez besoin d'échapper au !):

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

Démo:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

Listons maintenant toutes les foo sauf foo3

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 
33
codaddict

La bonne solution consiste à utiliser grep -v "Word" file, avec son équivalent awk:

awk '!/Word/' file

Cependant, si vous avez une situation plus complexe dans laquelle vous souhaitez, par exemple, XXX apparaître et YYYnot apparaître, alors awk est pratique. au lieu d’envoyer 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 que les lignes contenant XXX ou YYY, mais pas ZZZ:

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

etc.

29
fedorqui

Inverser la correspondance en utilisant grep -v:

grep -v "unwanted Word" file pattern
10
garima

grep fournit l'option '-v' ou '--invert-match' pour sélectionner les lignes non correspondantes.

par exemple.

grep -v 'unwanted_pattern' file_name

Cela produira toutes les lignes du fichier nom_fichier, qui ne contient pas'paternel_pattern '.

Si vous recherchez le modèle dans plusieurs fichiers 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 'wanted_pattern' dans tous les fichiers du répertoire courant et le transmettra à un second grep afin de filtrer le 'non désirée_pattern'. '|' - pipe indiquera à Shell de connecter la sortie standard du programme de gauche (grep -r 'wanted_pattern' *) à l'entrée standard du programme de droite (grep -v 'unwanted_pattern').

4
Shriganesh Shintre

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

grep -v ^unwanted_Word
4
st0le