Исходный файл dhcp.leases размер примерно 200 мегабайт или около 18млн записей в формате:lease 10.210.100.254 {
starts 0 2012/03/11 09:52:27;
ends 5 2012/03/16 09:52:27;
tstp 5 2012/03/16 09:52:27;
cltt 0 2012/03/11 09:52:27;
binding state free;
hardware ethernet 00:11:22:33:44:66;
uid "\001\000\021\"3Df";
set vendor-string = "MSFT 5.0";
}lease 10.8.234.253 {
starts 4 2011/06/02 11:56:20;
ends 2 2011/06/07 11:56:20;
tstp 2 2011/06/07 11:56:20;
cltt 4 2011/06/02 11:56:20;
binding state free;
hardware ethernet 00:22:33:44:55:27;
uid "\001\000\0363%\000'";
}Задача убрать все старые записи. Делаю запрос, для того чтобы убить 2011 год:
sed -n ':s;/ends . 2011/{:l;n;/}/{bs};bl};p' dhcp.leasesНа выходе получаю у 2011 года одну лишнюю строку "starts 4 2011/06/02 11:56:20;"
lease 10.210.100.254 {
starts 0 2012/03/11 09:52:27;
ends 5 2012/03/16 09:52:27;
tstp 5 2012/03/16 09:52:27;
cltt 0 2012/03/11 09:52:27;
binding state free;
hardware ethernet 00:11:22:33:44:66;
uid "\001\000\021\"3Df";
set vendor-string = "MSFT 5.0";
}lease 10.8.234.253 {
starts 4 2011/06/02 11:56:20;
}Как в рамках существующего sed запроса убить строчку, которая выше регулярного выражения?
т.е. хотелось бы получитьlease 10.8.234.253 {
}Или, чтобы данная запись просто изчезла из dhcp.leases
Заранее спасибо за помощь.
>[оверквотинг удален]
> }
> lease 10.8.234.253 {
> starts 4 2011/06/02 11:56:20;
> }
> Как в рамках существующего sed запроса убить строчку, которая выше регулярного выражения?
> т.е. хотелось бы получить
> lease 10.8.234.253 {
> }
> Или, чтобы данная запись просто изчезла из dhcp.leases
> Заранее спасибо за помощь.Так подойдет?
$ sed -n ':s;/\(starts\|ends\) . 2011/{:l;n;/}/{bs};bl};p' dhcp.leaseslease 10.210.100.254 {
starts 0 2012/03/11 09:52:27;
ends 5 2012/03/16 09:52:27;
tstp 5 2012/03/16 09:52:27;
cltt 0 2012/03/11 09:52:27;
binding state free;
hardware ethernet 00:11:22:33:44:66;
uid "\001\000\021\"3Df";
set vendor-string = "MSFT 5.0";
}lease 10.8.234.253 {
}
>[оверквотинг удален]
> tstp 5 2012/03/16 09:52:27;
> cltt 0 2012/03/11 09:52:27;
> binding state free;
> hardware ethernet 00:11:22:33:44:66;
> uid "\001\000\021\"3Df";
> set vendor-string = "MSFT 5.0";
> }
> lease 10.8.234.253 {
> }
>
Нет. Или тут к сожалению не проходит.
Имеем лизу выданную в прошлом году, но действительную в этом.
lease 10.8.234.250 {
starts 2 2011/07/26 13:16:09;
ends 0 2012/07/31 13:16:09;
tstp 0 2012/07/31 13:16:09;
cltt 2 2012/07/26 13:16:09;
binding state free;
hardware ethernet 11:22:33:65:73:a4;
uid "\001\034\301\336es\244";
set vendor-string = "MSFT 5.0";
}
На выходе получаем
lease 10.8.234.250 {
}
А это не верно, т.к. лиза действительная.
если нужна логика, то нужен awk, там есть условия.примером помочь не могу, т.к. на таком уровне не владею
> если нужна логика, то нужен awk, там есть условия.
> примером помочь не могу, т.к. на таком уровне не владеюМожно и на уровне sed сделать. Например, вот кусок
# напечатать строки, которые стоят ПЕРЕД строками с регулярным выражением regexp
sed -n '/regexp/{g;1!p;};h'но мне не понятно как этот пример совместить с моим.