Perl: анализ почтового журнала для получения даты / получателя в одном выражении регулярного выражения - PullRequest
0 голосов
/ 12 июня 2011

Я пытаюсь разобрать свой почтовый журнал, который содержит ряд строк, которые выглядят примерно так:

Jun  6 17:52:06 host sendmail[30794]: p569q3sX030792: to=<person@recipient.com>, ctladdr=<apache@host.com> (48/48), delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=121354, relay=gmail-smtp-in.l.google.com. [1.2.3.4], dsn=2.0.0, stat=Sent (OK 1307354043 x8si28599066ict.63)

Правила, которые я пытаюсь применить:

  • Дата всегда первые 2 слова
  • Адрес электронной почты всегда находится между "to=person@recipient.com", однако адрес электронной почты может быть окружен <>

В журнале есть несколько строк, которые не относятся к получателю, поэтому я хотел бы полностью игнорировать эти строки.

Следующий код работает для каждого правила в отдельности, однако у меня возникают проблемы с их объединением:

if($_ =~ m/\ to=([<>a-zA-Z0-9\.\@]*),\ /g) {
  print "$1\n";
}

if($_ =~ /^+(\S+\s+\S+\s)/g) {
  print "$1\n";
}

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 июня 2011
print substr($_, 0, 7), "$1\n" if / to=(.+?), /;

Ваша дата в формате фиксированной длины, вам не нужно регулярное выражение, чтобы соответствовать ей.
Для адреса вам нужна часть между to= и следующим ,, поэтому не жадное совпадение - это то, что вам нужно.

0 голосов
/ 12 июня 2011

Для совпадения с одним регулярным выражением, or они используют синтаксис (regex1|regex2) вместе:

((?<\ to=)[<>a-zA-Z0-9\.\@]*(?=,\ )|^\S+\s+\S+\s) 

Внешние скобки сохраняют $1 при назначении совпадения.

Внешний видза (?<\ to=) и взглядом в будущее (?=,\ ) ничего не захватывает, поэтому эти регулярные выражения захватывают только целевую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...