Usando grep -v em vários argumentos

12

Existe uma maneira mais simples de fazer isso? grep -v foo file | grep -v bar

Provavelmente existem maneiras muito elegantes de fazer isso com o egrep, mas como seguir com o grep antigo?

EDIT: grep -v 'foo\|bar' fileparece funcionar apenas com o GNU grep. Estou no Solaris. Alguma solução para isso?

rahmu
fonte
Pergunta estranha, porque no primeiro exemplo você está fazendo a correspondência AND, e no segundo você está fazendo a correspondência OR. O resultado será o mesmo apenas em condições muito específicas.
greenoldman
1
Não, na verdade não. No segundo exemplo, a -vbandeira é uma negação. not(A or B) == not(A) and not(B)
rahmu

Respostas:

21

Você pode ter vários testes em um único grepcomando passando cada expressão com um -eargumento, em vez de ser o primeiro argumento sem opção, como você normalmente vê:

$ grep -v -e foo -e bar file

Isso diz o mesmo que seu comando: linhas de impressão fileque não contêm "foo" nem "bar".

Lembre-se de que remover -vcompletamente inverte isso; também muda a operação lógica! Você obtém todas as linhas que contêm "foo" ou "bar".

Warren Young
fonte
12

grep -Ev 'word1|word2' deve funcionar muito bem

Deixe me ser
fonte
Como alternativa, você pode usar egrep e soltar a barra invertida para o personagem pipe:egrep -v 'word1|word2
Oldtimer
Acontece que isso não funciona com o Solaris grep. Eu instalei o GNU grep e funcionou perfeitamente. Vou editar minha pergunta para torná-la específica ao Solaris.
rahmu
2
O @rahmu \|é uma extensão GNU grep, mas você pode conseguir a mesma coisa de maneira portátil com -Ee com o |operador.
Gilles 'SO- stop be evil'