Divida el archivo de registro en pedazos y busque errores

Divida el archivo de registro en pedazos y busque errores

Quiero dividir un archivo de registro en pedazos y luego buscar errores en estos pedazos. Si hay un error, quiero colocar el fragmento del archivo de registro relevante en otro archivo.

Pequeño ejemplo:

El archivo de registro se ve así:

STARTLOG1
blabla
more_blabla
ENDLOG1
STARTLOG2
ERROR: Texto de error
Este es un error
del usuario XYZ
ENDLOG2
STARTLOG3
blabla
more_blabla
ENDLOG3

Quiero dividir el archivo de registro en pedazos. Todas las líneas entre STARTLOG y ENDLOG deben ser de 1 pieza. Cuando aparece un error en una pieza, extrae la pieza completa a un archivo. El archivo debería verse así:

ERROR DE STARTLOG2
: Texto de error
Este es un error
del usuario XYZ
ENDLOG2

Respuesta1

Prueba esto:

$ awk -v RS="STARTLOG" '/ERROR/{print RS$0; }' log
STARTLOG2
ERROR: Errortext
This is an Error
from user XYZ
ENDLOG2

Para redirigir a un archivo llamado logNdonde N es el número de STARTLOG, use:

gawk -v RS="STARTLOG" '/ERROR/{print RS$0 > "log"$1; }' log

Explicación

RSes el separador de registros, es lo que define para qué sirve una "línea" awk. Aquí, lo estoy configurando STARTLOGpara que todo el registro se trate como una sola línea. Luego, si esa "línea" contiene ERROR, imprimo STARTLOG(el RS, esto es solo para recrear el mismo formato).

También puedes utilizar el mismo enfoque con Perl:

perl -lne 'BEGIN{$/="STARTLOG"}{print "$/$_" if /ERROR/}' log 

información relacionada