2008-12-12 9 views
33

Estoy tratando de usar grep con -v para invert-match junto con -e para la expresión regular. Tengo problemas para obtener la sintaxis correcta.Usando grep con expresión regular para filtrar coincidencias

Estoy intentando algo así como

tail -f logFile | grep -ve "string one|string two" 

Si lo hago de esta manera no filtra Si lo cambio a

tail -f logFile | grep -ev "string one|string two" 

consigo

grep: string one|string two: No such file or directory 

He intentado usar() o comillas, pero no he podido encontrar nada que funcione.

¿Cómo puedo hacer esto?

Respuesta

50

El problema es que, de forma predeterminada, necesita escapar de sus | para obtener la alternancia adecuada. Es decir, grep interpreta que "foo | bar" coincide con la cadena literal "foo | bar" solamente, mientras que el patrón "foo \ | bar" (con un escape |) coincide con "foo" o "bar".

Para cambiar este comportamiento, usar la bandera -E:

tail -f logFile | grep -vE 'string one|string two' 

Alternativamente, el uso egrep, que es equivalente a -E grep:

tail -f logFile | egrep -v 'string one|string two' 

Además, el -e es opcional, a menos que su patrón comience con un guión literal. grep toma automáticamente el primer argumento no opcional como patrón.

+0

je, aprender algo nuevo todos los días, nunca antes había notado la bandera -E en grep. – Jay

+0

¿esta solución funciona para 'MacOS'? Intento 'historia | grep -vE 'ng | npm'' pero no funciona como se esperaba. – Sergii

+0

@Sergii: Sí, la versión de grep incluida con macOS (BSD grep) es totalmente compatible con los indicadores '-v' y' -E'. "No funciona" es una descripción vaga, deberá proporcionar más detalles. Le sugiero que haga una nueva pregunta, en lugar de publicarla en los comentarios aquí. –

5

tiene que escapar el símbolo de tubería cuando se utiliza -e:

tail -f logFile | grep -ve "string one\|string two" 

EDIT: o, como se señaló @Adam, puede utilizar la bandera -E:

tail -f logFile | grep -vE "string one|string two" 
+1

Probé la primera parte en mi sistema y tuvo los resultados deseados. No estoy seguro de lo que quiere decir con inexacto. – Jay

Cuestiones relacionadas