次の内容を含む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」行の6行目です。
答え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;