
Estoy intentando extraer datos entre 2 patrones coincidentes, solo si el contenido no está vacío y tengo problemas para hacerlo:
Aquí hay un ejemplo:
==============================
Queue Manager is : MQ73PCRTB2
==============================
==============================
Queue Manager is : MQ73PCSH01
==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100
==============================
Queue Manager is : MQ73PCSH02
==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100
==============================
Queue Manager is : MQ73PCSHA1
==============================
==============================
Queue Manager is : MQ73PCSHA2
==============================
Lo que quiero ver en el resultado es:
==============================
Queue Manager is : MQ73PCSH01
==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100
==============================
Queue Manager is : MQ73PCSH02
==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100
Sé que debo extraer líneas antes y después del texto coincidente, extraer todo entre patrones coincidentes, pero quiero saber cómo imprimir todo entre patrones coincidentes solo si los datos no están vacíos.
Esto es lo que probé y no funcionó:
grep -zPo '(?s)Queue(?:.(?!</Queue))*?\Current*?</Queue'
El archivo de texto original es generado por otro script.
Podría haber más de 3 líneas de datos entre el patrón coincidente 'Cola'
Respuesta1
Podrías intentarlo así
sed '/Queue/{N;$d;N;$d;N;/==$/d}' infile
Esto simplemente introduce las siguientes tres líneas cuando la línea coincide Queue
. Si el espacio del patrón termina con un separador 1 , lo elimina (o si 2, la primera línea o la segunda línea extraída es la última en la entrada).
Si otras líneas pueden terminar con signos consecutivos, =
debe reemplazar ==$
en la expresión regular con una coincidencia exacta para el separador, por ejemplo=\{37\}$
1: Esto supone que un separador es una línea coincidente ^[[:blank:]]*==*$
(por lo que no hay espacios finales).
2: Dado que el contenido de su archivo es producido por una secuencia de comandos, el archivo siempre debe terminar con una línea vacía, por lo que sed solo debe verificar si la segunda línea ingresada es la última línea del archivo (para detectar si el último bloque es vacío) pero en su ejemplo falta esa línea final, por lo tantocualquiera...
Respuesta2
BEGIN { RS="=====*\n" }
/Queue Manager/ {
manager = $0; next;
}
/[a-z]/ {
print RT manager RT $0;
}
La primera regla establece el delimitador de registros en cuatro o más signos iguales. La segunda regla realiza un seguimiento del "encabezado", es decir, el registro que contiene la cadena "Administrador de colas". La tercera regla imprime el encabezado y el registro actual si el registro contiene al menos una letra minúscula, es decir, no está vacío.