Usando grep -v en múltiples argumentos

12

¿Hay una manera más simple de hacer esto? grep -v foo file | grep -v bar

Probablemente hay formas muy elegantes de hacerlo con egrep, pero ¿cómo ir con grep simple?

EDITAR: grep -v 'foo\|bar' fileparece funcionar solo con GNU grep. Estoy en Solaris ¿Alguna solución para eso?

rahmu
fuente
Pregunta extraña porque en el primer ejemplo estás haciendo Y coinciden, y en el segundo estás haciendo OR coinciden. El resultado será el mismo solo en condiciones muy específicas.
greenoldman
1
No en realidad no. En el segundo ejemplo, la -vbandera es una negación. not(A or B) == not(A) and not(B)
rahmu

Respuestas:

21

Puede tener múltiples pruebas en un solo grepcomando pasando cada expresión con un -eargumento en lugar de como el primer argumento sin opción como normalmente ve:

$ grep -v -e foo -e bar file

Eso dice lo mismo que hace su comando: imprimir líneas fileque no contienen "foo" ni "bar".

Tenga en cuenta que eliminar -vcompletamente lo invierte; ¡También cambia la operación lógica! Obtiene todas las líneas que contienen "foo" o "bar".

Warren Young
fuente
12

grep -Ev 'word1|word2' debería funcionar bien

Déjame ser
fuente
Como alternativa, puede usar egrep y soltar la barra diagonal inversa para el carácter de la tubería:egrep -v 'word1|word2
OldTimer
Resulta que esto no funciona con el grep de Solaris. Instalé el GNU grep y trabajé perfectamente. Voy a editar mi pregunta para que sea específica de Solaris.
rahmu
2
@rahmu \|es una extensión grep de GNU, pero puede lograr lo mismo de forma portátil con -Ey el |operador.
Gilles 'SO- deja de ser malvado'