Cè un modo più semplice per farlo? grep -v foo file | grep -v bar

Ci sono probabilmente modi molto eleganti per farlo con egrep, ma come andare con il vecchio grep normale?

MODIFICA: grep -v "foo\|bar" file sembra funzionare solo con GNU grep. Io “sono su Solaris. Qualche soluzione per questo?

Commenti

  • Strana domanda perché nel primo esempio stai facendo una corrispondenza AND e nel secondo stai facendo una corrispondenza OR . Il risultato sarà lo stesso solo in condizioni molto specifiche.
  • No, non proprio. Nel secondo esempio, il flag -v è una negazione. not(A or B) == not(A) and not(B)

Risposta

Puoi avere più test in un comando grep passando ogni espressione con un argomento -e invece che come primo argomento non opzionale come si vede normalmente:

$ grep -v -e foo -e bar file 

Questo dice la stessa cosa che fa il tuo comando: stampa le righe da file che non contengono né “foo” né “bar” .

Tieni presente che la rimozione di -v inverte completamente questo aspetto; cambia anche loperazione logica! Ottieni tutte le righe che contengono “foo” o “bar”.

Answer

grep -Ev "word1|word2" dovrebbe funzionare bene

Commenti

  • In alternativa puoi usare egrep e rilasciare la barra rovesciata per il carattere pipe: egrep -v 'word1|word2
  • Risulta che non funziona con Solaris grep. Ho installato GNU grep e ha funzionato perfettamente. ' modifico la mia domanda per renderla specifica per Solaris.
  • @rahmu \| è un grep GNU estensione, ma puoi ottenere lo stesso risultato in modo portatile con -E e loperatore |.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *