Imprime texto entre delimitadores de várias linhas

1

Estou tentando extrair dados entre dois padrões de correspondência, apenas se o conteúdo não estiver vazio e eu tiver problemas ao fazer isso:

aqui é 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 para extrair linhas antes e depois da correspondência de texto, extrai tudo entre padrões de correspondência, mas quero saber como imprimir tudo entre padrão de correspondência 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 em dados entre o padrão de correspondência "Fila"

    
por MO12 16.05.2016 / 23:31

2 respostas

3

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 corresponder a Queue . Se o espaço padrão terminar com um separador 1 , ele será excluído (ou se 2 a 1ª linha ou a 2ª linha for a última da entrada). < br> Se outras linhas podem terminar 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 linha correspondente a ^[[:blank:]]*==*$ (portanto, nenhum espaço à direita).
2: Como o conteúdo do seu arquivo é produzido por um script, o arquivo deve sempre terminar com uma linha vazia - portanto, o sed deve verificar apenas se a segunda linha é a última linha do arquivo (para detectar se o último bloco está vazio), mas no seu exemplo está faltando a linha final. eu> ou ...

    
por 17.05.2016 / 13:01
1
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 acompanha o "cabeçalho", ou seja, o registro que contém a string "Gerenciador de filas". 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 vazia.

    
por 17.05.2016 / 09:33