特定の行に基づいて一意の文字列を解析します。

特定の行に基づいて一意の文字列を解析します。

次の内容を含む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;

関連情報