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 logN
donde N es el número de STARTLOG
, use:
gawk -v RS="STARTLOG" '/ERROR/{print RS$0 > "log"$1; }' log
Explicación
RS
es el separador de registros, es lo que define para qué sirve una "línea" awk
. Aquí, lo estoy configurando STARTLOG
para 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