parse string única baseada em uma determinada linha

1

Eu tenho um arquivo dhcpd.leases com o seguinte:

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;

Como você deve saber neste arquivo, algumas concessões são registradas várias vezes. Eu preciso de uma solução para apenas grep fora de um único endereço IP RANGE usando o 172.231.100 MAS apenas aqueles que têm um estado de ligação de ativo. Estou ciente de que existem scripts por aí que fazem isso para você com o DHCP, mas o nosso não está funcionando atm e uma solução de linha de comando para isso seria ótimo. Observe que a linha "binding state" sempre será a sexta linha da linha "lease".

    
por user53029 14.11.2017 / 16:38

1 resposta

1
Solução

awk :

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

A saída:

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;
    
por 14.11.2017 / 17:17