Utilizzo di grep -v su più argomenti


12

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

Probabilmente ci sono modi molto eleganti per farlo con egrep, ma come andare con il semplice vecchio grep?

EDIT: grep -v 'foo\|bar' filesembra funzionare solo con GNU grep. Sono su Solaris. Qualche soluzione per quello?


Domanda strana perché nel primo esempio stai facendo AND match, e nel secondo stai facendo OR match. Il risultato sarà lo stesso solo in condizioni molto specifiche.
Greenoldman,

1
No, non proprio. Nel secondo esempio, la -vbandiera è una negazione. not(A or B) == not(A) and not(B)
Rahmu,

Risposte:


21

Puoi avere più test in un singolo grepcomando passando ogni espressione con un -eargomento anziché come primo argomento non opzionale come normalmente vedi:

$ grep -v -e foo -e bar file

Ciò dice la stessa cosa che fa il tuo comando: stampare righe fileche non contengono né "pippo" né "barra".

Tieni presente che rimuovere -vcompletamente inverte questo; cambia anche l'operazione logica! Ottieni tutte le righe che contengono "pippo" o "barra".


12

grep -Ev 'word1|word2' dovrebbe funzionare bene


In alternativa puoi usare egrep e rilasciare la barra rovesciata per il carattere pipe:egrep -v 'word1|word2
OldTimer

Si scopre che questo non funziona con il grep di Solaris. Ho installato GNU grep e ho funzionato perfettamente. Ho intenzione di modificare la mia domanda per renderla specifica per Solaris.
Rahmu,

2
@rahmu \|è un'estensione grep GNU, ma puoi ottenere la stessa cosa in modo portatile con -Ee l' |operatore.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.