¿Hay alguna forma de grep
registrar 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 -z
bandera 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 Fields
rodeada 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 gawk
dela respuesta del conductor de aceroen caso de que gawk
no 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.