다음과 유사한 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