The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Sed для парсинга dhcp.leases"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Sed для парсинга dhcp.leases"  +/
Сообщение от spions email(ok) on 17-Май-12, 23:33 
Исходный файл 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
Заранее спасибо за помощь.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Sed для парсинга dhcp.leases"  +/
Сообщение от allez (ok) on 18-Май-12, 09:17 
>[оверквотинг удален]
> }
> 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.leases

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 {
}


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Sed для парсинга dhcp.leases"  +/
Сообщение от spions (ok) on 18-Май-12, 10:04 
>[оверквотинг удален]
>   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 {
}
А это не верно, т.к. лиза действительная.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Sed для парсинга dhcp.leases"  +/
Сообщение от slon (??) on 18-Май-12, 10:32 
если нужна логика, то нужен awk, там есть условия.

примером помочь не могу, т.к. на таком уровне не владею

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Sed для парсинга dhcp.leases"  +/
Сообщение от spions (ok) on 18-Май-12, 10:57 
> если нужна логика, то нужен awk, там есть условия.
> примером помочь не могу, т.к. на таком уровне не владею

Можно и на уровне sed сделать. Например, вот кусок

# напечатать строки, которые стоят ПЕРЕД строками с регулярным выражением regexp
sed -n '/regexp/{g;1!p;};h'

но мне не понятно как этот пример совместить с моим.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру