Infra_HDC

ezproxy-leaders-extract4.pl

May 10th, 2020
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.04 KB | None | 0 0
  1. use strict;
  2. use warnings;
  3. use v5.8;
  4.  
  5. my $filename = 'ezp202005.log'; # входящий файл лога, открываем
  6. open(my $fh, '<:encoding(UTF-8)', $filename)
  7.   or die "Could not open file '$filename' $!";
  8.  
  9. # дата для извлечения из файла лога инфы только за определенную дату
  10. my $strdate=q|10\/May\/2020|;
  11.  
  12. # шаблон для парсинга строк лога
  13. # где:
  14. #   $1 -- IP-адрес
  15. #   $2 -- какой-то хеш, наверно для ID сессии
  16. #   $3 -- время (без даты)
  17. #   $4 -- размер отданных клиенту данных, байт
  18. 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+|;
  19. $pattern .= q|["][^"]+["]\s+\d{1,3}\s+([0-9]+).*$|;
  20.  
  21. # ассоциативный массив (хеш) для хранения отчета, ключ -- IP-адрес, значение -- суммарный трафик за календарные сутки
  22. my %hosts1 = ();
  23.  
  24. # читаем входной файл построчно
  25. while (my $row = <$fh>) {
  26.  chomp $row;
  27.  
  28. # если строка удовлетворяет регулярному выражению, извлекаем данные и записываем их в ассоциативный массив (хеш)
  29. if (my @strm = $row =~ m/$pattern/) { $hosts1{$1} += $4; }
  30.  
  31. }
  32.  
  33. # выводим результат в STDOUT (но можно перенаправить вывод в .csv-файл, правильно?)
  34. # шапка csv
  35. #   комментарий с датой отчета
  36. printf "# DATE IS %s\n",$strdate;
  37. #   шапка таблицы
  38. printf "IP,SIZE\n";
  39. # сортируем строки хеша по убыванию значений (лидеры по скачиванию будут наверху)
  40. for my $key (sort { $hosts1{$b} <=> $hosts1{$a} } keys %hosts1) {
  41. # выводим
  42.   printf "%s,%s\n",$key,${hosts1}{$key};
  43. }
Add Comment
Please, Sign In to add comment