Buscar patrón de cadena en archivo/entrada, búsqueda dependiente del contexto (no como grep)

Buscar patrón de cadena en archivo/entrada, búsqueda dependiente del contexto (no como grep)

¿Existe alguna utilidad disponible para buscar texto, como en grep(linux) o findstr(dos), pero para comenzar a buscar solo después de encontrar otro texto/patrón determinado?

Como tratar de encontrar un texto/patrón determinado en un archivo, pero solo los que están dentro de una sección particular del archivo. En mi caso, solo 'el archivo' es una salida de otro programa y la cantidad de líneas generadas es demasiada para escribirla en un archivo y analizarla allí.

ejemplo:

section ONE
  text_a
  text_b
  text_c
section TWO
  text_b
  text_c
section THREE
  . . .

busque si hay algún "text_c" solo en la sección DOS.

Intenté leer greplas opciones de pero no parece tener esta capacidad. También se espera que esto minimice la cantidad de comparaciones de cadenas, ya que "text_c" es mucho más largo que los nombres de las secciones.

Respuesta1

Consideremos este archivo de prueba:

$ cat file
section ONE
  text_a
  text_b
  text_c  <-ignore this
section TWO
  text_b
  text_c  <-keep this
section THREE
  text_a
  text_b
  text_c  <-ignore this

Para seleccionar cualquier línea que contenga text_cque esté en section TWO:

$ awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/' file
  text_c  <-keep this

Si la entrada no se genera a partir de un archivo sino de command, utilice:

command | awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/'

Cómo funciona

  • /^section/{f=0}

    Cada vez que encontremos una línea que comience con section, establezca f=0.

  • /^section TWO/{f=1}

    Si la línea comienza con section TWO, anule el comando anterior y establezca f=1.

  • f && /text_c/

    Si fes distinto de cero y la línea actual coincide text_c, imprima la línea.

Respuesta2

También puedes hacer esto con sedme gusta:

command | sed -n -e '/section TWO/,/section THREE/ { /text_c/p;}'

esto funciona por:

  • -nle dice sedque no imprima líneas coincidentes de forma predeterminada
  • -eda sedun guión para trabajar
    • /section TWO/,/section THREE/establece nuestro rango de direcciones, por lo que vamos a aplicar la siguiente función a todas las líneas entre las líneas que coinciden section TWOysection THREE
    • { /text_c/p;}define la función que coincidirá con una línea text_cy si la encuentra la pimprimirá

Respuesta3

Si el número de líneas que siguen a cada sección es algo constante, puedes usar el comando '-AX'opción en grep para imprimirXlíneas que siguen una coincidencia de sección. Luego, esto se puede canalizar a un segundo grep que busca su patrón dentro de la 'sección DOS'.

$ cat file
section ONE
  1 text_a
  1 text_b
  1 text_c  
section TWO
  2_text_a
  2 text_b
  2 text_c  
section THREE
  3 text_a
  3 text_b
  3 text_c 

$ grep -A3 'section TWO' file | grep text_c
  2 text_c

información relacionada