Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use strict;
- use warnings;
- use v5.8;
- my $filename = 'ezp202005.log'; # входящий файл лога, открываем
- open(my $fh, '<:encoding(UTF-8)', $filename)
- or die "Could not open file '$filename' $!";
- # дата для извлечения из файла лога инфы только за определенную дату
- my $strdate=q|10\/May\/2020|;
- # шаблон для парсинга строк лога
- # где:
- # $1 -- IP-адрес
- # $2 -- какой-то хеш, наверно для ID сессии
- # $3 -- время (без даты)
- # $4 -- размер отданных клиенту данных, байт
- my $pattern = q|^([0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3})\s+-\s+([a-zA-Z0-9]{15})\s+\[|.$strdate.q|\:([0-9]{2}\:[0-9]{2}\:[0-9]{2})\s{1}\+[0-9]{4}\]\s+|;
- $pattern .= q|["][^"]+["]\s+\d{1,3}\s+([0-9]+).*$|;
- # ассоциативный массив (хеш) для хранения отчета, ключ -- IP-адрес, значение -- суммарный трафик за календарные сутки
- my %hosts1 = ();
- # читаем входной файл построчно
- while (my $row = <$fh>) {
- chomp $row;
- # если строка удовлетворяет регулярному выражению, извлекаем данные и записываем их в ассоциативный массив (хеш)
- if (my @strm = $row =~ m/$pattern/) { $hosts1{$1} += $4; }
- }
- # выводим результат в STDOUT (но можно перенаправить вывод в .csv-файл, правильно?)
- # шапка csv
- # комментарий с датой отчета
- printf "# DATE IS %s\n",$strdate;
- # шапка таблицы
- printf "IP,SIZE\n";
- # сортируем строки хеша по убыванию значений (лидеры по скачиванию будут наверху)
- for my $key (sort { $hosts1{$b} <=> $hosts1{$a} } keys %hosts1) {
- # выводим
- printf "%s,%s\n",$key,${hosts1}{$key};
- }
Add Comment
Please, Sign In to add comment