разбор почты с помощью perl

У меня есть файл почтового журнала в /var/log/mailog. Структура содержимого показана ниже:

Feb 13 10:13:24 mailer dove: imap-login: Login: user=<[email protected]>, method=PLAIN, rip=::ffff:14.012.251.125, lip=::ffff:33.01.121.12.80
Feb 13 10:13:25 mailer dove: imap-login: Disconnected: rip=::ffff:10.100.2.10, lip=::ffff:33.01.121.12.81
Feb 13 10:13:25 mailer dove: pop3-login: Disconnected: rip=::ffff:10.100.2.10, lip=::ffff:33.01.121.12.81
Feb 13 10:13:25 mailer dove: pop3-login: Disconnected: rip=::ffff:10.100.2.10, lip=::ffff:33.01.121.12.80
Feb 13 10:13:25 mailer dove: imap-login: Disconnected: rip=::ffff:10.100.2.10, lip=::ffff:33.01.121.12.80
Feb 13 10:13:26 mailer dove: POP3([email protected]): Disconnected: Logged out top=0/0, retr=0/0, del=0/24, size=187461
Feb 13 10:13:26 mailer dove: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=::ffff:14.012.251.125, lip=::ffff:33.01.121.12.80
Feb 13 10:13:26 mailer dove: POP3([email protected]): Disconnected for inactivity top=0/0, retr=0/0, del=0/32, size=473758028
Feb 13 10:13:26 mailer dove: POP3([email protected]): Disconnected for inactivity top=0/0, retr=0/0, del=0/9, size=140778365
Feb 13 10:13:26 mailer dove: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=::ffff:14.012.251.125, lip=::ffff:33.01.121.12.80
Feb 13 10:13:28 mailer dove: POP3([email protected]): Disconnected: Logged out top=0/0, retr=1/8336, del=1/1, size=8319
Feb 13 10:13:28 mailer dove: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=::ffff:21.254.145.12, lip=::ffff:33.01.121.12.

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

Я пробовал ниже, но это печатает только каждого пользователя;

perl -ne 
 '$l{$2}=$1 if /^(.{15}) .* imap-login: 
  Login: user=<([^>]+)>/; END 
  { 
    print "$_ last imap-login: $l{$_}\n" 
    for keys %l 
  }' /var/log/maillog

Не могли бы вы помочь мне настроить этот скрипт.


person Bitmap    schedule 13.02.2013    source источник


Ответы (1)


Попробуйте сделать это:

perl -lne '
    $h{$1}++ if /imap-login:\s+Login:\s+user=<([^>]+)>/;
    END{
        foreach my $key (sort { $h{$a} <=> $h{$b} } keys(%h)) {
            print $key, " ", $h{$key}
        }
    }
' /var/log/mail.log

ИЗМЕНИТЬ

Если вы хотите добавить время доступа, обойдите это:

perl -wlne '
    do{
        $h{$2}{inc}++;
        $h{$2}{time}="$2";
    } if /^(\w+\s+\d+\s+\d+:\d+:\d+).*?Login:\s+user=<([^>]+)>/;
    END{
        use Data::Dumper;
        print Dumper \%h;
    }
'

Вам просто нужно разобрать HASH.

person Gilles Quenot    schedule 13.02.2013
comment
Хороший спутник! Быстро, не могли бы вы помочь отсортировать это по размеру в порядке возрастания и, возможно, удалить дубликаты ;-) - person Bitmap; 13.02.2013
comment
Великолепно! Быстрая мысль, могу ли я добавить к этому последнее время доступа ?! - person Bitmap; 13.02.2013
comment
Можете ли вы показать немного поисковых усилий? Вам просто нужно изменить регулярное выражение, чтобы добавить второй захват... - person Gilles Quenot; 13.02.2013
comment
Простите за этот спутник, не очень хорошо разбирающийся в perl и regex. Я пробовал perl -lne '$h{$1}++ if /^(.{15}).*imap-login:\s+Login:\s+user=<([^>]+)>/;END без особого удовольствия. - person Bitmap; 13.02.2013