Hoe kan ik één woord uitsluiten met grep?

Ik heb iets nodig als:

grep ^"unwanted_word"XXXXXXXX

Antwoord 1, autoriteit 100%

Je kunt het doen met -v(voor --invert-match) optie van grep als:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" filefiltert de regels met het unwanted_worden grep XXXXXXXXgeeft alleen regels weer met het patroon XXXXXXXX.

BEWERKEN:

Uit je opmerking lijkt het alsof je alle regels wilt weergeven zonder het unwanted_word. In dat geval heb je alleen het volgende nodig:

grep -v 'unwanted_word' file

Antwoord 2, autoriteit 11%

Ik begreep de vraag als “Hoe kan ik een woord matchen maar een ander uitsluiten”, waarvoor één oplossing twee greps in serie is: eerste grep vindt het gewenste “woord1”, tweede grep sluit “woord2” uit:

grep "word1" | grep -v "word2"

In mijn geval: ik moet onderscheid maken tussen “plot” en “#plot”, wat de “woord”-optie van grep niet zal doen (“#” is geen alfanumeriek).

Hopelijk helpt dit.


Antwoord 3, autoriteit 4%

Als uw grepde reguliere expressie van Perl met de optie -Pondersteunt, kunt u dit doen (indien bash; indien tcsh moet u de !):

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

Demo:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

Laten we nu alle foovermelden behalve foo3

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

Antwoord 4, autoriteit 4%

De juiste oplossing is om grep -v "word" filete gebruiken, met zijn awkequivalent:

awk '!/word/' file

Als u echter een complexere situatie heeft waarin u bijvoorbeeld XXXwilt laten verschijnen en YYYnietwilt verschijnen , dan is awkhandig in plaats van meerdere greps door te sturen:

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

Je kunt zelfs iets ingewikkelders zeggen. Bijvoorbeeld: ik wil die regels die ofwel XXXof YYYbevatten, maar niet ZZZ:

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

enz.


Antwoord 5

Overeenkomst omkeren met grep -v:

grep -v "unwanted word" file pattern

Antwoord 6

grep biedt de optie ‘-v’ of ‘–invert-match’ om niet-overeenkomende regels te selecteren.

bijv.

grep -v 'unwanted_pattern' file_name

Hiermee worden alle regels van het bestand bestandsnaam uitgevoerd, dat geen ‘ongewenst patroon’ heeft.

Als u het patroon zoekt in meerdere bestanden in een map, kunt u de recursieve zoekoptie als volgt gebruiken

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

Hier probeert GreP alle voorvallen van ‘Whange_pattern’ in alle bestanden vanuit de momenteel map in te stellen en door te geven aan tweede grep om de ‘ongewenste_pattern’ uit te filteren.
‘|’ – Pijp vertelt Shell om de standaarduitvoer van het linkerprogramma (GreP -R ‘Wanted_Pattern’ *) aan te sluiten op standaardinvoer van het juiste programma (GreP-V ‘ongewenste_pattern’).


Antwoord 7

De optie -vtoont u alle regels die niet overeenkomen met het patroon.

grep -v ^unwanted_word

Antwoord 8

Ik heb het root (“/”) Mount Point uitgesloten met behulp van grep -vw "^/".

# cat /tmp/topfsfind.txt| head -4 |awk '{print $NF}'
/
/root/.m2
/root
/var
# cat /tmp/topfsfind.txt| head -4 |awk '{print $NF}' | grep -vw "^/"
/root/.m2
/root
/var

Antwoord 9

Ik heb een map met een stel bestanden. Ik wil alle bestanden vinden die niet de string “Speedup” bevatten, dus ik heb de volgende opdracht met succes gebruikt:

grep -iL speedup *

Other episodes