Remover linha correspondente a um padrão se a próxima linha não corresponder a outro padrão

5

Abaixo está a saída de extração do meu script de verificação, que eu gostaria de imprimir apenas o nome do host e erro. Se não houver erro para o host, exclua também a entrada do nome do host.
A lógica que quero usar é excluir a linha existente se a próxima linha não corresponder a "NOT OK"
Pode usar awk ou sed ... qualquer utilitário é bom para correspondência de padrões.

NSAS_HOST:d01-emsacssb01
NSAS_HOST:d01-emsacssb02
NSAS_HOST:emsacssbcon01
NOT OK main load processes
NOT OK 5.3% AXConfigurator
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.bak is not UP, but ifcfg-eth1.bak sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:emsacssb03
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:emsacsnb01
NSAS_HOST:emsacsnb02
NSAS_HOST:d02-emsacssb01
NSAS_HOST:d02-emsacssb02
NSAS_HOST:b2bcms01
NSAS_HOST:b2bcms02
NSAS_HOST:d02-b2bpgdb01
NOT OK bond0: device speed not determined
NOT OK bond1: device speed not determined

Resultado esperado:

NSAS_HOST:emsacssbcon01
NOT OK main load processes
NOT OK 5.3% AXConfigurator
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.bak is not UP, but ifcfg-eth1.bak sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:emsacssb03
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:d02-b2bpgdb01
NOT OK bond0: device speed not determined
NOT OK bond1: device speed not determined

Basicamente:
1. procure pelo termo NSAS_HOST
2. verifique a próxima linha para NOT OK . Se existirem linhas de impressão até chegarmos ao próximo NSAS_HOST
3. Se NOT OK não existir, apenas apague a linha NSAS_HOST

    
por Roy M 08.11.2016 / 00:13

3 respostas

1

com sed:

sed -ne '/NSAS_HOST/{N;/NOT OK/{p}};/NSAS_HOST/!p' FILE 

OUTPUT:

NSAS_HOST:emsacssbcon01
NOT OK main load processes
NOT OK 5.3% AXConfigurator
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.bak is not UP, but ifcfg-eth1.bak sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:emsacssb03
NOT OK eth0.orig is not UP, but ifcfg-eth0.orig sets ONBOOT=yes
NOT OK eth1.orig is not UP, but ifcfg-eth1.orig sets ONBOOT=yes
NSAS_HOST:d02-b2bpgdb01
NOT OK bond0: device speed not determined
NOT OK bond1: device speed not determined
    
por 08.11.2016 / 00:45
4

Você pode usar sed para este trabalho:

sed '/NSAS_HOST/{$d;N;/\n.*NOT OK/!D;}' infile

Isto apenas extrai a linha N ext em cada linha que corresponde a NSAS_HOST (exceto se na linha $ t quando d elimina o espaço padrão). Se a segunda linha no espaço padrão não corresponder a NOT OK , ela D será excluída até a nova linha (ou seja, excluirá a primeira linha no espaço padrão) e reiniciará o ciclo.

    
por 08.11.2016 / 00:48
0

É tão fácil em grep puro:

grep --no-group-separator -B1 ^"NOT OK" log 
    
por 08.11.2016 / 00:48