Добрый день!У меня есть лог, который выглядит вот таким образом:
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. Но, как-то я никак не представлю себе - как это должно выглядить.
Нужна Ваша помощь.Спасибо.
А вот еще к теме. Просмотрел таки 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
Стало совсем грустно.
>Добрый день!
>
>У меня есть лог, который выглядит вот таким образом:
>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. Но, как-то я никак не представлю себе
>- как это должно выглядить.
> Нужна Ваша помощь.
>
> Спасибо.
>Ну, это же регекспы чистой воды.
>Ну, это же регекспы чистой воды.Умеете ободрить:) Того же и Вам желаю в подобных ситуациях.
Я не просил написать за меня решение, но если оно Вам известно и оно такое смехотворное, что не достойно большего, чем Вы написали, наверное можно было намекнуть.
P.S. Кроме того, должен же быть способ "отсечения" ненужных данных без regexp, которыми хотелось бы обрабатывать то, что останется, а не использовать их в каждой дыре. Файлы все-таки не маленькие... Возможно я заблуждаюсь.
Конечно=)
`perldoc perlreref`
=)
Что надо сделать-то с этим самым логом?
Каков должен быть результат?Как правильно было замечено, надо использовать регулярные выражения.
Для того, чтобы подсказать, как их тут можно использовать надо знать, что Вы хотите получить в результате.
>Что надо сделать-то с этим самым логом?
>Каков должен быть результат?
>
>Как правильно было замечено, надо использовать регулярные выражения.
>Для того, чтобы подсказать, как их тут можно использовать надо знать, что
>Вы хотите получить в результате.Для начала искал способ правильно разбить строку, в которой может быть переменное число эллементов. Уже все нашел. Это прекрасно делает сам split.
Собссна говоря об чем вопрос? узнать откуда, куда и сколько байт было передано?
Сразу могу указать на просчет в вашей логике.
Ваша т.н. "первая строка" это запись о старте демона, котрый занимается сбором пакетов.
Если в процессе работы демона был рестарт - эта строка появится заново уже в теле лога в 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})/;
Можно все то же самое одной строкой сделать, но повторно понять что написал потом уйдет много времени :) в этом весь перл :)