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

Existem provavelmente maneiras muito elegantes de fazer isso com o egrep, mas como usar o grep antigo e simples?

EDITAR: grep -v "foo\|bar" file parece funcionar apenas com GNU grep. Estou no Solaris. Alguma solução para isso?

Comentários

  • Pergunta estranha porque no primeiro exemplo você está fazendo AND match, e no segundo você está OR match . O resultado será o mesmo apenas em condições muito específicas.
  • Não, não realmente. No segundo exemplo, o sinalizador -v é uma negação. not(A or B) == not(A) and not(B)

Resposta

Você pode ter vários testes em um único comando grep passando cada expressão com um argumento -e em vez de como o primeiro argumento não opcional, como você normalmente vê:

$ grep -v -e foo -e bar file 

Isso diz a mesma coisa que seu comando: imprime linhas de file que não contêm “foo” nem “bar” .

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

Resposta

grep -Ev "word1|word2" deve funcionar bem

Comentários

  • Como alternativa, você pode usar egrep e soltar a barra invertida para o caractere barra vertical: egrep -v 'word1|word2
  • Acontece que isso não funciona com o grep Solaris. Instalei o GNU grep e funcionou perfeitamente. Eu ' vou editar minha pergunta para torná-la específica do Solaris.
  • @rahmu \| é um grep GNU extensão, mas você pode conseguir a mesma coisa de forma portátil com -E e o operador |.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *