次のようなipvsadm出力を処理する必要があります。
IP Virtual Server version 0.2.12 (size=16384)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP lvs2.mack.net:0 rr persistent 360
-> RS2.mack.net:0 Route 1 0 0
-> RS1.mack.net:0 Route 1 0 0
-> RS3.mack.net:0 Route 1 0 0
TCP lvs2.mack.net:https rr
-> RS2.mack.net:https Route 1 0 0
TCP lvs2.mack.net:telnet rr
-> RS2.mack.net:telnet Route 1 0 0
-> RS1.mack.net:telnet Route 1 0 0
TCP lvs2.mack.net:ssh rr
TCP lvs2.mack.net:hvr rr
出力では、現在これらのVIPにのみ「アクティブ」物理ノードが2つ未満であると予想されます。したがって、上記のサンプルデータを処理すると、予想される出力は次のようになります。
TCP lvs2.mack.net:https rr
-> RS2.mack.net:https Route 1 0 0
TCP lvs2.mack.net:ssh rr
TCP lvs2.mack.net:hvr rr
ご覧のとおり、VIP には物理ノードが 1 つだけアクティブで、残りの 2 つは使用できないためです。
答え1
Awk
解決策:
awk 'NR<4{ next }
/TCP/{ if (host && c<2) printf "%s%s\n",host,(c==1? ORS node:""); host=$0; c=0 }
host && $1=="->"{ node=$0; c++ }
END{ if (host && c<2) print host }' file
NR<4{ next }
- 最初の3行をスキップします(NR
読み取った行の総数を示します)。/TCP/
- 遭遇したとき所有者行は次から始まりますTCP
。host=$0
- ライン全体を変数としてキャプチャhost
c=0
- 現在のノード数を計算します。所有者if (host && c<2) printf "%s%s\n",host,(c==1? ORS node:"")
- 以前に処理されたホストがあり、そのノード数が次の場合c<2
- ホスト行とそのノード(存在する場合)を印刷します。
host && $1=="->"{ node=$0; c++ }
- 現在処理中の場合所有者- キャプチャ節変数に行を書き込み、node
ノード数を増やします。c++
END{ if (host && c<2) print host }
- 処理されたが印刷されていない残りのホストを確認します。
出力:
TCP lvs2.mack.net:https rr
-> RS2.mack.net:https Route 1 0 0
TCP lvs2.mack.net:ssh rr
TCP lvs2.mack.net:hvr rr