Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> parse maillog, необходимо проанализировать maillog 
:(
    Опции темы
Strafer
Дата 10.5.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



Доброго времени суток подскажите пожайлуста ответ на такой вопрос как дописать строку regexp
я хочу проанализировать maillog, но мой шаблон регулярного выражения работает до того как натыкаюсь на слово stat
вот пример строки из maillog
Код

Apr 27 04:02:11 server sendmail[5495]: m3R126h9005272: to=<[email protected]>, ctladdr=<[email protected]> (541/586), delay=00:00:03, xdelay=00:00:02, mailer=esmtp, pri=121903, relay=relay.server.com. [111.111.111.111], dsn=2.0.0, stat=Sent (m3R1298r027765 Message accepted for delivery)

регуляное выражение выглядит вот так 
Код

/^(\w+) (\d+) (\d+:\d+:\d+) (\w+) sendmail\[(\d+)\]: (\w+): to=<([\w.]+@[\w.]+)>, ctladdr=<([\w.]+@[\w.]+)> \((\d+)\/(\d+)\), delay=(\d+:\d+:\d+), xdelay=(\d+:\d+:\d+), mailer=(\w+), pri=(\d+), relay=([\w.]+) \[([\w.]+)\], dsn=([\w.]+),

правильность выражения проверяю с помощью RegExp Tester
там показывает найденые строки и переменные на которые они разбивается регулярным выражением.
После того как дописываю в конце regexp 
Код

stat=(\w+)
 уже ничего не работает. насколько я понимаю stat это встроеный оператор(или зарезервированое слово ибо оно выделяется при написании скрипта)
P.S. пытался написать 
Код
sta(.)=
Код
[\w+=(\w+)]
Код
[\w+]=(\S+)
 но это не работает
PM MAIL ICQ   Вверх
tolkien
Дата 10.5.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



Код

$s = 'Apr 27 04:02:11 server sendmail[5495]: m3R126h9005272: to=<[email protected]>, ctladdr=<[email protected]> (541/586), delay=00:00:03, xdelay=00:00:02, mailer=esmtp, pri=121903, relay=relay.server.com. [111.111.111.111], dsn=2.0.0, stat=Sent (m3R1298r027765 Message accepted for delivery)';

if ($s =~ /^(\w+) (\d+) (\d+:\d+:\d+) (\w+) sendmail\[(\d+)\]: (\w+): to=<([\w.]+@[\w.]+)>, ctladdr=<([\w.]+@[\w.]+)> \((\d+)\/(\d+)\), delay=(\d+:\d+:\d+), xdelay=(\d+:\d+:\d+), mailer=(\w+), pri=(\d+), relay=([\w.]+) \[([\w.]+)\], dsn=([\w.]+), stat=(\w+)/)
{
  print "ok\n";
  foreach my $expr (1..$#-) 
  {    
    next if (!defined(${$expr}));
    print "$expr = ${$expr}\n";
  }
}


результат
ok
1 = Apr
2 = 27
3 = 04:02:11
4 = server
5 = 5495
6 = m3R126h9005272
7 = [email protected]
8 = [email protected]
9 = 541
10 = 586
11 = 00:00:03
12 = 00:00:02
13 = esmtp
14 = 121903
15 = relay.server.com.
16 = 111.111.111.111
17 = 2.0.0
18 = Sent

Как видишь все у тебя работает. Слово stat тут ни при чем. Выкинь  RegExp Tester
PM MAIL   Вверх
Strafer
Дата 14.5.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



в данной конструкции работает, но при таком варианте у меня не работало
Код

while(<MAILLOG>)
{
    if (m/\w+ \d+ \d+:\d+:\d+ \w+ sendmail\[\d+\]: \w+: to=<[\w.]+@[\w.]+>, ctladdr=<[\w.]+@[\w.]+> \(\d+\/\d+\), delay=\d+:\d+:\d+, xdelay=\d+:\d+:\d+, mailer=\w+, pri=\d+, relay=[\w.]+ \[[\w.]+\], dsn=[\w.]+, stat=\w+ \([\w+ ]+\)/)
      {
      my ($mon, $day, $time, $host, $msgid, $owner, $sender, $rbyte, $sbyte, $delay, $sdelay, $mailer, $pri, $relay, $relayip, $dsn, $stat, $comment) = /^(\w+) (\d+) (\d+:\d+:\d+) (\w+) sendmail\[(\d+)\]: (\w+): to=<([\w.]+@[\w.]+)>, ctladdr=<([\w.]+@[\w.]+)> \((\d+)\/(\d+)\), delay=(\d+:\d+:\d+), xdelay=(\d+:\d+:\d+), mailer=(\w+), pri=(\d+), relay=([\w.]+) \[([\w.]+)\], dsn=([\w.]+), stat=(\w+) \([\w+ ]+\)$/;
       print "For test $owner and $msgid\n";
      }
}

попробую сделать как Ты сказал и не буду морочить себе голову
P.S. Я только начал осваивать регулярные выражения и учит perl поетому ориентировался на стандартные примеры из книг

Это сообщение отредактировал(а) Strafer - 14.5.2008, 21:59
PM MAIL ICQ   Вверх
Strafer
Дата 23.5.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.4.2008

Репутация: нет
Всего: нет



блин извеняюсь что пишу опять сюда(новую тему решил не создавать) опираясь на вішенаписаное строку на переменніе разбил, из файла maillog  меня интересует 2 типа строк
те которіе FROM и те которие TO итого получается
Код

while(<MAILLOG>)
{
            if ($stroka1 =~ /регульное віражение с TO/)
             {
             обработка данніх 
             }
            elsif ($stroka2 =~/регялное віражение с FROM/)
           {
           обработка данніх
            }
}

есть 2 таблиці 
в первой 2 стобца номер и емаил
во второй 5 датавремя, номеротправ(из первой таблиці), номерполуч(из первой таблиці), отправбайт, приянтобайт, статус
так вот
мне на єтом форуме подсказали (yura_nev)как заполнять таблицу уникальнімі значениями
до цікла обработки
Код

my $dbsearch = $db->prepare("SELECT Email, contact_id FROM contacts");
$dbsearch->execute;
my $contacts = { map {@{$_}} $dbsearch->fetchall};

и в самом цікле
Код

 unless(exists $contacts->{$owner} )
          {
          $db->do("INSERT INTO contacts VALUES(NULL, '$owner')");
          my $sth = $db->prepare("SELECT LAST_INSERT_ID()");
          $sth->execute;
          ($contacts->{$owner}) = $sth->fetchrow_array or die "MySQl error: ".$db->errstr;
          }
 unless(exists $contacts->{$sender} )
          {
          $db->do("INSERT INTO contacts VALUES(NULL, '$sender')");
          my $sth = $db->prepare("SELECT LAST_INSERT_ID()");
          $sth->execute;
          ($contacts->{$sender}) = $sth->fetchrow_array or die "MySQl error: ".$db->errstr;
          }

     $db->do("INSERT INTO  data VALUES('$datetime', $contacts->{$owner}, $contacts->{$sender}, $sbyte, $rbyte, 'Send')");

єто все хорошо, но как видно из написаного в масиве хешей хранится и отправитель и получатель 
на что мне скрипт відаёт ошибку конкатинации (слово не вігавариваю)
может кто нибудь подчкажет идею как сделать чтобі в перую таблицу зановились уникальние значения емаил адресов. я так понимаю что єто надо віделить в подпрограмму ибо віполнятся должно в цікле if ...... elseif
P.S. прошу прощения за украинские букві пришлось русский временно оключить, а то 3 язіка неудобно печатать, мне до конца месяца надо сдать диплом
поетому и пишу и "разрабатіваю" одновременно

Это сообщение отредактировал(а) Strafer - 23.5.2008, 20:55
PM MAIL ICQ   Вверх
tolkien
Дата 25.5.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



У тебя email поле ведь ключевое. Так ненадо тебе самому писать какие либо проверки достаточно средств mysql.

NSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]

Параметр IGNORE говорит чтобы игнорировались повторения. 

http://dev.mysql.com/doc/refman/5.0/en/insert.html
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.