J'ai besoin de quelque chose comme:
grep ^"unwanted_Word"XXXXXXXX
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
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.
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
$
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 YYY
not apparaître, alors awk
est pratique. au lieu d’envoyer plusieurs grep
s:
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.
Inverser la correspondance en utilisant grep -v:
grep -v "unwanted Word" file pattern
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').
L'option -v
vous montrera toutes les lignes qui ne correspondent pas au motif.
grep -v ^unwanted_Word