以下は私のチェックスクリプトの抽出された出力です。ホスト名とエラーのみを印刷したいです。ホストにエラーがない場合は、ホスト名エントリも削除します。私が
使用したいロジックは、次の行が「NOT OK」と一致しない場合は既存の行を削除することです。または...どのユーティリティでもパターンマッチングに適しています。awk
sed
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
(パターンスペースを削除する$
ときのd
lat行を除く)。パターンスペースの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 ^--$