Imprimir texto entre delimitadores de várias linhas

Imprimir texto entre delimitadores de várias linhas

Estou tentando extrair dados entre dois padrões correspondentes, somente se o conteúdo não estiver vazio e tiver problemas para fazer isso:

aqui está um exemplo:

 ==============================
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
 ==============================

O que eu quero ver na saída é:

 ==============================
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

Eu sei que devo extrair linhas antes e depois do texto correspondente, extrair tudo entre os padrões correspondentes, mas quero saber como imprimir tudo entre os padrões correspondentes apenas se os dados não estiverem vazios.

Aqui está o que eu tentei e não funcionou:

grep -zPo '(?s)Queue(?:.(?!</Queue))*?\Current*?</Queue'

O arquivo de texto original é gerado por outro script.

Pode haver mais de 3 linhas de dados entre o padrão correspondente 'Queue'

Responder1

Você poderia tentar assim

sed '/Queue/{N;$d;N;$d;N;/==$/d}' infile

Isso apenas puxa as próximas três linhas quando a linha corresponde Queue. Se o espaço do padrão terminar com um separador 1, ele o excluirá (ou se 2 a 1ª linha ou a 2ª linha puxada for a última na entrada).
Se outras linhas terminarem com =sinais consecutivos, você deve substituir o ==$na regex por uma correspondência exata para o separador, por exemplo=\{37\}$


1: Isso pressupõe que um separador é uma correspondência de linha ^[[:blank:]]*==*$(portanto, sem espaços à direita).
2: Como o conteúdo do seu arquivo é produzido por um script, o arquivo deve sempre terminar com uma linha vazia - então o sed deve apenas verificar se a segunda linha extraída é a última linha do arquivo (para detectar se o último bloco é vazio), mas no seu exemplo essa linha final está faltando, portanto, oqualquer...

Responder2

BEGIN { RS="=====*\n" }
/Queue Manager/ {
    manager = $0; next;
}
/[a-z]/ {
    print RT manager RT $0;
}

A primeira regra define o delimitador de registro para quatro ou mais sinais de igual. A segunda regra controla o "cabeçalho", ou seja, o registro que contém a string "Queue Manager". A terceira regra imprime o cabeçalho e o registro atual se o registro contiver pelo menos uma letra minúscula, ou seja, não estiver vazio.

informação relacionada