Cómo hacer barra vertical | trabajar en grep?

10

Aquí hay un ejemplo de una línea de comando grep que he probado:

grep '(565172|565173|565175)' /var/log/cups/error_log

No produce ningún resultado, a pesar de que los 3 valores están en el archivo varias veces.

Intenté escapar de las barras, y eso mejoró un poco las cosas: se detectó el valor medio pero no el primero ni el último.

grep '(565172\|565173\|565175)' /var/log/cups/error_log

También probé escapes dobles y volví a no obtener resultados.

grep '(565172\\|565173\\|565175)' /var/log/cups/error_log

¿Qué estoy haciendo mal? Gracias.

Mark Ransom
fuente

Respuestas:

14

La sintaxis que está tratando de usar pertenece a expresiones regulares extendidas, por lo que la respuesta es muy simple, use egrepo incluya la -Ebandera.

Adam Byrtek
fuente
17

Lo que está encontrando es la diferencia entre expresiones regulares básicas y extendidas. De la página del manual de grep:

En expresiones regulares básicas, los metacaracteres?, +, {, |, (Y) pierden su significado especial; en su lugar use las versiones con barra invertida \ ?, +, {, \ |, (, y).

Por lo tanto, puede hacer uno de los siguientes:

 grep '\(565172\|565173\|565175\)' /var/log/cups/error_log

o

grep -E '(565172|565173|565175)' /var/log/cups/error_log

La bandera -E activa las expresiones regulares "extendidas". GNU grep también admite expresiones regulares compatibles con perl.

Steven D
fuente
Me distraje al escribir mi respuesta. Parece que Adam me ha golpeado hasta el golpe.
Steven D
44
Pero agregaste a la explicación: la razón por la que no pude hacer que funcione es que estaba escapando solo de la barra y no de los padres.
Mark Ransom
1
No sabía que puedes escapar de estos personajes especiales una vez más para obtener el mismo resultado, ¡así que +1 para ti!
Adam Byrtek
1
Lo anterior es el conjunto de intercambios más civilizado que he visto en SO / SE.
Mike roedor