次の行が他のパターンと一致しない場合は、パターンに一致する行を削除してください。

次の行が他のパターンと一致しない場合は、パターンに一致する行を削除してください。

以下は私のチェックスクリプトの抽出された出力です。ホスト名とエラーのみを印刷したいです。ホストにエラーがない場合は、ホスト名エントリも削除します。私が
使用したいロジックは、次の行が「NOT OK」と一致しない場合は既存の行を削除することです。または...どのユーティリティでもパターンマッチングに適しています。
awksed

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

予想される結果:

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

デフォルトでは:
1.用語を検索します。NSAS_HOST
2. 次の行があることを確認しますNOT OK。存在する場合は、次のNSAS_HOST
3行に達するまで行が印刷されます。NOT OK存在しない場合は、その行を削除してくださいNSAS_HOST

答え1

sedこれに使用できるもの:

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

Nこれは、一致するすべての行の追加の行を取得しますNSAS_HOST(パターンスペースを削除する$ときのdlat行を除く)。パターンスペースの2行目が一致しない場合は、NOT OK改行D文字まで削除(つまり、パターンスペースの1行目を削除)してループを再開します。

答え2

sedで:

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

出力:

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

答え3

GNU grepで使用するのは非常に簡単です--no-group-separatorオプションオプションに加えて-B

grep --no-group-separator -B1 ^"NOT OK" log 

またはそうでgrepない--no-group-separator場合は、グループ間の行を-B削除します。--

grep -B1 ^"NOT OK" log | grep -v ^--$

関連情報