Er det en enklere måte å gjøre dette på? grep -v foo file | grep -v bar

Det er sannsynligvis veldig elegante måter å gjøre det med egrep på, men hvordan går man med vanlig gammel grep?

EDIT: grep -v "foo\|bar" file ser ut til å fungere bare med GNU grep. Jeg er på Solaris. Noen løsning på det?

Kommentarer

  • Merkelig spørsmål fordi du i det første eksemplet gjør OG matcher, og i det andre gjør du ELLER matcher . Utfallet vil være det samme bare under veldig spesifikke forhold.
  • Nei egentlig ikke. I det andre eksemplet er -v -flagget en negasjon. not(A or B) == not(A) and not(B)

Svar

Du kan ha flere tester i en enkelt grep kommando ved å sende hvert uttrykk med et -e -argument i stedet for som det første ikke-alternativ-argumentet som du vanligvis ser:

$ grep -v -e foo -e bar file 

Det sier det samme som kommandoen din gjør: skriv ut linjer fra file som verken inneholder «foo» eller «bar» .

Husk at fjerning av -v inverterer dette fullstendig; det endrer også den logiske operasjonen! Du får alle linjene som inneholder «foo» eller «bar».

Svar

grep -Ev "word1|word2" skal fungere fint

Kommentarer

  • Som et alternativ kan du bruke egrep og slippe tilbakesnittet for rørkarakter: egrep -v 'word1|word2
  • Viser seg at dette ikke fungerer med Solaris grep. Jeg installerte GNU grep og fungerte perfekt. Jeg ' skal redigere spørsmålet mitt for å gjøre det Solaris spesifikt.
  • @rahmu \| er en GNU grep utvidelse, men du kan oppnå det samme på en bærbar måte med -E og | operatøren.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *