ipvsadm 出力処理

ipvsadm 出力処理

次のような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

関連情報