Réponses:
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
-v 'unwanted_word' --after Nn'aide pas car il comprend la ligne et N lignes après.
-vou --invert-matchsélectionnez des lignes qui ne correspondent pas. Dans votre cas grep -v 'unwanted_word' fileou grep --invert-match 'unwanted_word' file.
git status -s |grep -v "folder_I_dont_care"
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.
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.
word1.
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
$
grep -v -Pfonctionne également sans négation dans l'expression régulière.
!" . Merci merci merci! Voilà ce que je voulais!
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.
grep -Psolution sur les gros fichiers.
grep -Psignifie utiliser Perl regexp, donc le chargement de ce paquet sera beaucoup plus cher qu'une normale grep.
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').
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 *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"