¿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 grep
las 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_c
que 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
, establezcaf=0
./^section TWO/{f=1}
Si la línea comienza con
section TWO
, anule el comando anterior y establezcaf=1
.f && /text_c/
Si
f
es distinto de cero y la línea actual coincidetext_c
, imprima la línea.
Respuesta2
También puedes hacer esto con sed
me gusta:
command | sed -n -e '/section TWO/,/section THREE/ { /text_c/p;}'
esto funciona por:
-n
le dicesed
que no imprima líneas coincidentes de forma predeterminada-e
dased
un 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 coincidensection TWO
ysection THREE
{ /text_c/p;}
define la función que coincidirá con una líneatext_c
y si la encuentra lap
imprimirá
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