Cómo usar grep para 2 líneas diferentes

15

¿Cómo puedo buscar dos frases diferentes cuando están en dos líneas diferentes usando un solo grepcomando?

Por ejemplo

Línea 1: Esto es un dulce.

Línea 2: limón.

Usé esto pero ningún resultado

grep "sweet.*lemon" file_type
Vijay Chakraborty
fuente

Respuestas:

20

Para usar grepdos líneas diferentes, busque ambos patrones

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

O usa alternancia

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Para obtener la siguiente línea después de un patrón, puede usar la opción de contexto

$ grep -A1 sweet file_type
This is a sweet
lemon.

Pero si usted está buscando de forma explícita para un patrón de líneas múltiples, eso es porque complicado greppiensa en líneas ... . Su .*capturará todo lo que entre "dulce" y "limón" en la línea . Podemos obtener "limón" en la siguiente línea con el -Puso \npara que coincida con la nueva línea y al decir que grepel archivo está nulo separado con -z:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Notas:

  • -EUse expresiones regulares extendidas (para usar |caracteres para alternar sin necesidad de escapar)
  • -An Imprima líneas adicionales después del patrón, donde n es el número de líneas finales para imprimir
  • -PUtilice expresiones regulares de estilo perl ("experimental" en grep- instalarpcregrep lugar para un mejor soporte de perl)
  • -zUse el carácter nulo como separador (solo finge en este caso, pero greptomará nuestra palabra)
  • -o solo imprime la parte coincidente
Zanna
fuente
Si bien el grep -zPcomando funcionaría en este caso específico (un archivo que consta de exactamente dos líneas), en general consideraría que cualquier archivo separado por una nueva línea es una sola línea, por lo tanto, volcar todo el contenido del archivo (si hay una coincidencia en alguna parte) o nada; por lo general, eso no es lo que la gente usa grep.
Marc van Leeuwen
sí, esto solo es útil con -o... editado ...
Zanna
En caso de que se intente en otras distribuciones, puede encontrar un: grep: The -P and -z options cannot be combined- por ejemplo, grep (GNU grep) 2.5.1 en RHEL
Jason Pyeron el
6

Me gusta esto:

grep "sweet\|lemon"
madneon
fuente
lo siento, pero esto coincidirá exactamente con "dulce | limón"
αғsнιη
44
@KasiyA Esta línea funciona bien. greppor defecto funciona en "modo estándar", donde "caracteres especiales" |, como +, *se interpretan literalmente a menos que estén enmascarados con una barra diagonal inversa. Ver por ejemplo esta respuesta . Para usar la forma en que probablemente esté acostumbrado, que los "caracteres especiales" necesitan ser enmascarados para ser interpretados literalmente, necesita cambiar al "modo extendido" ( grep -E). Tal vez Madneon podría dar más detalles sobre sus respuestas, por ejemplo, ¿qué habría intentado con los OP ?
Henning Kockerbeck