URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4236
[ Назад ]

Исходное сообщение
"Снова вопрос по split"

Отправлено Rusy_M , 05-Май-05 19:52 
Добрый день!

У меня есть лог, который выглядит вот таким образом:
Thu May  5 04:02:46 2005; ******** IP traffic monitor started ********          
Thu May  5 04:02:46 2005; TCP; eth1; 1500 bytes; from x.x.x.x:59086 to x.x.x.x:13215; first packet                                              
Thu May  5 04:02:46 2005; TCP; eth1; 52 bytes; from x.x.x.x:25 to x.x.x.x:59023
Thu May  5 04:02:46 2005; TCP; eth1; 472 bytes; from x.x.x.x:59023 to x.x.x.x:25; first packet      (SYN)

В цикле while (<LOG>)я поставил count++;
  и next if ($count == 1);
Таким образом проблему с первой строкой решил. А вот далее бардак.
Если стороку разделять через split (";"), то над нужными переменными придется еще работать (отсекать bytes, from и т.д. ). Гораздо проще было бы делать split(" "), но "first packet" и (SYN )все портят (впрочем,  портит он и в случае split(";")).
Слабый, нетреннерованный мозг подсказывает мне, что до split можно было бы проверять строку на наличие "артефактов" и удалять их, оставляя все ровненьким и приемлимым для split. Но, как-то я никак не представлю себе - как это должно выглядить.
Нужна Ваша помощь.

Спасибо.


Содержание

Сообщения в этом обсуждении
"Снова вопрос по split"
Отправлено Rusy_M , 05-Май-05 20:14 
А вот еще к теме. Просмотрел таки 200 Мб лог и нашел еще чудные строки  
Thu May  5 19:34:45 2005; TCP; eth1; 56 bytes; from x.x.x.x:80 to x.x.x.x:50486; first packet (SYN)                                                                                              
Thu May  5 19:34:45 2005; TCP; eth1; 52 bytes; from x.x.x.x:80 to x.x.x.x:50482; FIN acknowleged
Thu May  5 19:34:45 2005; TCP; eth1; 52 bytes; from x.x.x.x:50483 to x.x.x.x:80; FIN sent; 6 packets, 694 bytes, avg flow rate 0.00 kbits/s  
                                                                                                                                                                              
Стало совсем грустно.                                                                            

"Снова вопрос по split"
Отправлено madskull , 05-Май-05 20:28 
>Добрый день!
>
>У меня есть лог, который выглядит вот таким образом:
>Thu May  5 04:02:46 2005; ******** IP traffic monitor started ********
>
>Thu May  5 04:02:46 2005; TCP; eth1; 1500 bytes; from x.x.x.x:59086
>to x.x.x.x:13215; first packet
>Thu May  5 04:02:46 2005; TCP; eth1; 52 bytes; from x.x.x.x:25
>to x.x.x.x:59023
>Thu May  5 04:02:46 2005; TCP; eth1; 472 bytes; from x.x.x.x:59023
>to x.x.x.x:25; first packet      (SYN)
>
> В цикле while (<LOG>)я поставил count++;
>  и next if ($count == 1);
> Таким образом проблему с первой строкой решил. А вот далее бардак.
>
> Если стороку разделять через split (";"), то над нужными переменными придется
>еще работать (отсекать bytes, from и т.д. ). Гораздо проще было
>бы делать split(" "), но "first packet" и (SYN )все портят
>(впрочем,  портит он и в случае split(";")).
> Слабый, нетреннерованный мозг подсказывает мне, что до split можно было бы
>проверять строку на наличие "артефактов" и удалять их, оставляя все ровненьким
>и приемлимым для split. Но, как-то я никак не представлю себе
>- как это должно выглядить.
> Нужна Ваша помощь.
>
> Спасибо.
>

Ну, это же регекспы чистой воды.


"Снова вопрос по split"
Отправлено Rusy_M , 05-Май-05 23:24 
>Ну, это же регекспы чистой воды.

Умеете ободрить:) Того же и Вам желаю в подобных ситуациях.

Я не просил написать за меня решение, но если оно Вам известно и оно такое смехотворное, что не достойно большего, чем Вы написали, наверное можно было намекнуть.


P.S. Кроме того, должен же быть способ "отсечения" ненужных данных без regexp, которыми хотелось бы обрабатывать то, что останется, а не использовать их в каждой дыре. Файлы все-таки не маленькие... Возможно я заблуждаюсь.  


"Снова вопрос по split"
Отправлено MaVeRiCk , 05-Май-05 22:29 
Конечно=)
`perldoc perlreref`
=)


"Снова вопрос по split"
Отправлено Андрей , 06-Май-05 06:20 
Что надо сделать-то с этим самым логом?
Каков должен быть результат?

Как правильно было замечено, надо использовать регулярные выражения.
Для того, чтобы подсказать, как их тут можно использовать надо знать, что Вы хотите получить в результате.


"Снова вопрос по split"
Отправлено Rusy_M , 06-Май-05 12:01 
>Что надо сделать-то с этим самым логом?
>Каков должен быть результат?
>
>Как правильно было замечено, надо использовать регулярные выражения.
>Для того, чтобы подсказать, как их тут можно использовать надо знать, что
>Вы хотите получить в результате.

Для начала искал способ правильно разбить строку, в которой может быть переменное число эллементов. Уже все нашел. Это прекрасно делает сам split.


"Снова вопрос по split"
Отправлено mthawk , 10-Май-05 11:21 
Собссна говоря об чем вопрос? узнать откуда, куда и сколько байт было передано?
Сразу могу указать на просчет в вашей логике.
Ваша т.н. "первая строка" это запись о старте демона, котрый занимается сбором пакетов.
Если в процессе работы демона был рестарт - эта строка появится заново уже в теле лога в NNNNN-ой строке.
а регекспом выковырять нужную Вам информацию гораздо проще, чем "подгонять" строку под split
NN bytes; from x.x.x.x:25 to x.x.x.x:59023
($bytes)=$LOG_HANDLER=~/(\d+)\sbytes/;
($from_addr)=$LOG_HANDLER=~/from ((\d{1,3}\.){3}\d{1,3})/;
($to_addr)=$LOG_HANDLER=~/to ((\d{1,3}\.){3}\d{1,3})/;
Можно все то же самое одной строкой сделать, но повторно понять что написал потом уйдет много времени :) в этом весь перл :)