Is er een eenvoudigere manier om dit te doen? grep -v foo file | grep -v bar

Er zijn waarschijnlijk zeer elegante manieren om het met egrep te doen, maar hoe ga je om met gewoon oud grep?

BEWERK: grep -v "foo\|bar" file lijkt alleen te werken met GNU grep. Ik gebruik Solaris. Is daar een oplossing voor?

Reacties

  • Vreemde vraag omdat je in het eerste voorbeeld EN match doet en in het tweede OR match . Het resultaat zal alleen in zeer specifieke omstandigheden hetzelfde zijn.
  • Nee, niet echt. In het tweede voorbeeld is de vlag -v een negatie. not(A or B) == not(A) and not(B)

Antwoord

Je kunt meerdere tests hebben in een enkel grep commando door elke uitdrukking door te geven met een -e argument in plaats van als het eerste niet-optie argument zoals je normaal ziet:

$ grep -v -e foo -e bar file 

Dat zegt hetzelfde als wat je commando doet: regels afdrukken van file die noch “foo” noch “bar” bevatten .

Onthoud dat het verwijderen van -v dit volledig omkeert; het verandert ook de logische operatie! Je krijgt alle regels die “foo” of “bar” bevatten.

Answer

grep -Ev "word1|word2" zou prima moeten werken

Reacties

  • Als alternatief kun je egrep gebruiken en de backslash voor de pipe character: egrep -v 'word1|word2
  • Blijkt dat dit niet werkt met de Solaris grep. Ik heb de GNU grep geïnstalleerd en werkte perfect. Ik ' ga mijn vraag bewerken om deze Solaris-specifiek te maken.
  • @rahmu \| is een GNU-grep extensie, maar je kunt hetzelfde bereiken op een draagbare manier met -E en de | operator.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *