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개만 활성화되어 있고 나머지 두 개는 사용할 수 없기 때문입니다.

답변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

관련 정보