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).
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 YYYne 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:
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:
À 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!
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Réponses:
Vous pouvez le faire en utilisant l' option
-v
(for--invert-match
) de grep comme:grep -v "unwanted_word" file
filtrera les lignes qui ont leunwanted_word
etgrep XXXXXXXX
listera uniquement les lignes avec motifXXXXXXXX
.É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:la source
-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 casgrep -v 'unwanted_word' file
ougrep --invert-match 'unwanted_word' file
.git status -s |grep -v "folder_I_dont_care"
sun
, sauf quand c'est le cassunrise
, unegrep sun|grep -v sunrise
ligne qui contient les deuxsun
etsunrise
à 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":
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.
la source
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!
):Démo:
Laissez-nous maintenant énumérer tout
foo
sauffoo3
la source
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 sonawk
équivalent:Cependant, s'il vous arrive d'avoir une situation plus complexe dans laquelle vous voulez, disons,
XXX
apparaître etYYY
ne pas apparaître, alors celaawk
est pratique au lieu de passer plusieursgrep
s:Vous pouvez même dire quelque chose de plus complexe. Par exemple: je veux ces lignes contenant soit
XXX
ouYYY
, mais pasZZZ
:etc.
la source
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 normalegrep
.Inverser la correspondance en utilisant grep -v:
la source
grep fournit l'option '-v' ou '--invert-match' pour sélectionner les lignes qui ne correspondent pas.
par exemple
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
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').
la source
L'
-v
option vous montrera toutes les lignes qui ne correspondent pas au motif.la source
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:
la source