Grep registra y obtiene texto entre delimitadores de registro

Grep registra y obtiene texto entre delimitadores de registro

¿Hay alguna forma de grepregistrar y buscar texto entre los delimitadores de entrada del registro? Nuestro archivo de registro separa la entrada de línea con caracteres " -------" Entonces, cuando busco la palabra de texto, quiero todas las líneas antes y después de los delimitadores en el registro.

Registro de muestra

------------------------------------------------------------------------

    r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines
    Removed unused "Calculated Fields" column entry.
    Jira ID: JIRA-977

------------------------------------------------------------------------

En lo anterior, usaría Grep para la palabra Campos, pero quiero todas las líneas entre las ----líneas " "

Respuesta1

Si sabe qué tan grande es el registro, puede generar líneas adicionales de contexto antes ( -B) y después ( -A) de la línea coincidente, por ejemplo.

grep -A2 -B2 'Fields' sample.log

o para contexto tanto antes como después de la línea de coincidencia

grep -C3 'Fields' sample.log

Hasta donde yo sé, la única forma de hacer una verdadera coincidencia de varias líneas (en lugar de una coincidencia de una sola línea más contexto) en GNU grep es usando el modo de expresión regular PCRE ( -P) con la -zbandera para evitar interrupciones en nuevas líneas. Por ejemplo, podrías intentar

grep -zPo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'

que hace una coincidencia no codiciosa de la cadena Fieldsrodeada por cualquier carácter O nueva línea, siempre que esté reservada por elnueva línea-guiones-nueva líneadelimitadores. Una expresión equivalente en pcregrep es

pcregrep -Mo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'


Otra opción para este tipo de datos estructurados por registros es awk: en particular, GNU awk permite utilizar una expresión regular para los datos internos.separador de registrosRS, por ejemplo

$ gawk -vRS='\n-+\n' '/Fields/ {print}' sample.log

r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines

Removed unused "Calculated Fields" column entry.

Jira ID: JIRA-977

Respuesta2

Una solución Perl similar a la gawkdela respuesta del conductor de aceroen caso de que gawkno esté disponible:

perl -ne 'BEGIN{$/= "-"x72 . "\n"} chomp and print if /Fields/' log_file

Reemplace 72 por la cantidad real de guiones en su delimitador.

información relacionada