특정 줄을 기반으로 고유한 문자열을 구문 분석합니다.

특정 줄을 기반으로 고유한 문자열을 구문 분석합니다.

다음 내용이 포함된 dhcpd.leases 파일이 있습니다.

lease 172.231.100.152 {
starts 2 2017/11/14 14:50:41;
ends 2 2017/11/14 15:20:41; 
tstp 2 2017/11/21 15:05:41;
cltt 2 2017/11/14 14:50:41;
binding state active;
next binding state expired;

lease 172.231.100.152 {
starts 2 2017/11/14 14:50:41;
ends 2 2017/11/14 15:20:41; 
tstp 2 2017/11/21 15:05:41;
cltt 2 2017/11/14 14:50:41;
binding state active;
next binding state expired;

lease 172.231.100.152 {
starts 2 2017/11/14 14:50:41;
ends 2 2017/11/14 15:20:41; 
tstp 2 2017/11/21 15:05:41;
cltt 2 2017/11/14 14:50:41;
binding state free;
next binding state expired;

lease 172.231.100.151 {
starts 2 2017/11/14 14:50:41;
ends 2 2017/11/14 15:20:41; 
tstp 2 2017/11/21 15:05:41;
cltt 2 2017/11/14 14:50:41;
binding state active;
next binding state expired;

lease 172.231.100.152 {
starts 2 2017/11/14 14:50:41;
ends 2 2017/11/14 15:20:41; 
tstp 2 2017/11/21 15:05:41;
cltt 2 2017/11/14 14:50:41;
binding state free;
next binding state expired;

이 문서에서 알 수 있듯이 일부 임대는 여러 번 기록됩니다. 고유한 IP 주소 범위를 파악하려면 172.231.100을 사용하고 바인딩 상태가 활성화된 IP 주소 범위만 사용하는 솔루션이 필요합니다. DHCP를 사용하여 이 작업을 수행할 수 있는 스크립트가 있다는 것을 알고 있지만 우리 스크립트는 atm에서 작동하지 않으므로 명령줄 솔루션이 있다면 좋을 것입니다. "Binding Status" 줄은 항상 "Lease" 줄의 여섯 번째 줄입니다.

답변1

해결책:

awk '/^lease/ && !($2 in ips){ f=1; ips[$2]=$0; n=NR+5 }
     f && NR <= n{ 
         a[++c]=$0; 
         if (NR == n) { 
             if ($NF == "active;") { 
                 for (i=1; i<7; i++) print a[i]; print "" 
             } 
             c=0 
         } 
     }' dhcpd.leases

산출:

lease 172.231.100.152 {
starts 2 2017/11/14 14:50:41;
ends 2 2017/11/14 15:20:41; 
tstp 2 2017/11/21 15:05:41;
cltt 2 2017/11/14 14:50:41;
binding state active;

lease 172.231.100.151 {
starts 2 2017/11/14 14:50:41;
ends 2 2017/11/14 15:20:41; 
tstp 2 2017/11/21 15:05:41;
cltt 2 2017/11/14 14:50:41;
binding state active;

관련 정보