анализатор журнала Perl для exim4 mta - PullRequest
1 голос
/ 20 апреля 2011

Я собираюсь написать парсер журнала для exim4 MTA, и у меня есть пара вопросов.(я знаю, что есть программа exilog)

Вопрос: 1. Какой лучший способ разобрать строку ?(около 5Gb таких строк: D) Я получил эту строку $:

2011-12-24 12:32:12 MeSSag3-Id-Ye <hostname> (from@some.email) <to@some.email> => H=[321.123.321.123] T="Hello this is a test"

и хочу получить все это поля в переменные .Сейчас я использую что-то вроде ($var,[var2])=($line =~ /somecoolregexp/ );это быстро / хорошо, или я должен использовать что-то еще?

1 Ответ

1 голос
/ 21 апреля 2011

Ну, это зависит от того, что вы хотите сделать с данными.

Предполагая, что у вас есть большой while (<>) { ... }, вы можете получить самый простой анализ, просто используя split:

my @fields = split;

Следующим уровнем будет добавление немного значения

my ($date, $time, $id, $host, $from, $to, undef, $dest) = split;

(Обратите внимание, вы можете присвоить undef, если хотите игнорировать результат)

Наконец, выможно убрать много ссор с помощью регулярного выражения.Вы также можете объединить вышеприведенное разделение с меньшими регулярными выражениями, чтобы очистить каждое поле индивидуально.

my ($datetime, $id, $host, $from, $to, $dest) = 
    /([\d-]+ [\d:]+) \s+     # date and time together
     (\S+)           \s+     # message id, just a block of non-whitespace
     <(.*?)>         \s+     # hostname in angle brackets, .*? is non-greedy slurp
    \((.*?)\)        \s+     # from email in parens
     <(.*?)>         \s+     # to email in angle brackets
      \S+            \s+     # separated between to-email and dest
      (\S+)                  # last bit, could be improved to (\w)=\[(.*?)\]
     /x;                     # /x lets us break all of this up, so its a bit readable

Конечно, вы можете продолжать использовать это для всех видов глупостей, но если вы собираетесь начать делать большеПри конкретном разборе этих полей я бы пошел с начальным разбиением с последующим разбором разбитых полей.Например:

 my ($date, $time, ...) = split;

 my ($year, $month, $day)    = split(/-/, $date);
 my ($hour, $min,   $sec)    = split(/:/, $time);
 my ($from_user, $from_host) = ( $from =~ /< ([^\@]+) \@ (.*) >/x );
 ...etc...
...