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" file
filtrera les lignes qui ont le unwanted_word
et grep XXXXXXXX
listera 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 N
n'aide pas car il comprend la ligne et N lignes après.
-v
ou --invert-match
sélectionnez des lignes qui ne correspondent pas. Dans votre cas grep -v 'unwanted_word' file
ou 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 sunrise
ligne qui contient les deux sun
et 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 grep
prend en charge l'expression régulière Perl avec -P
option, 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 foo
sauffoo3
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
grep -v -P
fonctionne é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, XXX
apparaître et YYY
ne pas apparaître, alors cela awk
est pratique au lieu de passer 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 ces lignes contenant soit XXX
ou YYY
, mais pas ZZZ
:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
etc.
grep -P
solution sur les gros fichiers.
grep -P
signifie 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"