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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите пожалуйста, где я сделал ошибку...... парсинг лога 
:(
    Опции темы
treee
Дата 23.12.2010, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот программа:

Код



#!/usr/bin/perl

use strict;

my($F)='/tmp/maillog';

my $logs = "/1";

unless (open(I,"<",$F)) { print "Can't open file $F\n"; exit 1; }

while(<I>) {
  my ($month, $day, $time, $name, $service, $id, $all) = split /\s+/,$_,7;

    if ($all=~ m /.*reject.*/)

     {

print "$all\n";

}

}



Вот лог:

Dec  19 04:44:40 proxy postfix/smtpd[23076]: NOQUEUE: reject: RCPT from unknown[11.11.11.7]: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in virtual mailbox table; from=<[email protected]> to=<[email protected]> proto=SMTP helo=<chello.se>
Dec  21 08:22:46 proxy postfix/smtpd[11968]: 3C8FB184002: client=unknown[10.10.10.10], sasl_method=PLAIN, sasl_username=test
Dec  21 08:22:46 proxy postfix/cleanup[11691]: 3C8FB184002: message-id=<[email protected]>
Dec  21 08:22:46 proxy postfix/qmgr[32521]: 3C8FB184002: from=<[email protected]>, size=1227, nrcpt=1 (queue active)
Dec  21 08:22:46 proxy postfix/smtpd[11968]: disconnect from unknown[10.10.10.10]
Dec  21 08:22:46 proxy postfix/smtp[11811]: 3C8FB184002: to=<[email protected]>, relay=127.0.0.1[127.0.0.1]:10026, delay=0.13, delays=0.01/0/0.01/0.11, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=07654-17, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 5504318400F)
Dec  21 08:22:46 proxy postfix/qmgr[32521]: 3C8FB184002: removed


Собственно сам вопрос, если     if ($all=~ m /.*reject.*/)

то print "$all\n"; выводит: поле из лога reject: RCPT from..........., мне надо чтобы эта строка не выводилась, а выводились все остальные. Пробовал делать if ($all ne ~ m /.*reject.*/) , с такой настройкой он выводит все поля $all. Где я не прав, спасибо.

Это сообщение отредактировал(а) treee - 23.12.2010, 08:21
PM MAIL   Вверх
alezzz
Дата 23.12.2010, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Код

$all!~ m /.*reject.*/


так?
PM MAIL   Вверх
ginnie
Дата 23.12.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



alezzz, лучше, наверное $all !~ m/reject/.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
treee
Дата 23.12.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



alezzz, 
ginnie, 
Спасибо огромное....

Еще вопросец, я чуточку усложнил программу и на выходе почему-то двоится и лишнее сиплется, что то туплю.......

Код

#!/usr/bin/perl

use strict;

my($F)='/tmp/maillog';

my $logs = "/1";

my %zed;

unless (open(I,"<",$F)) { print "Can't open file $F\n"; exit 1; }

while(<I>) {
  my ($month, $day, $time, $name, $service, $id, $all) = split /\s+/,$_,7;

    if (($id=~ /([a-z0-9]+)\:/i) and ($all!~ m /.*reject.*/i))
{

        if (($all=~ m /from=/i) or ($all=~ m /to=/i) or ($all=~ m /client=/i))
        {
        my $id = $1;

 while ($all =~ /(client|size|from|to)=(\S+?)(\s|,)/g)
       {
               $zed{$id}->{$1} = $2;
}}}

foreach my $id (keys %zed)
{
  $zed{$id}->{'client'} =~ s/(.+)\[(\d+\.\d+\.\d+\.\d+)\]/$2/;
    $zed{$id}->{'from'} =~ s/<(.+)>/$1/;
     $zed{$id}->{'to'} =~ s/<(.+)>/$1/;

print "FROM=$zed{$id}->{'from'}, TO=$zed{$id}->{'to'}, SIZE=$zed{$id}->{'size'}, CLIENT=$zed{$id}->{'client'}\n";
}}



Выход:

FROM=, TO=, SIZE=, CLIENT=10.10.10.10
FROM=, TO=, SIZE=, CLIENT=10.10.10.10
[email protected], TO=, SIZE=1227, CLIENT=10.10.10.10
[email protected], TO=, SIZE=1227, CLIENT=10.10.10.10
[email protected], [email protected], SIZE=1227, CLIENT=10.10.10.10
[email protected], [email protected], SIZE=1227, CLIENT=10.10.10.10

А хотелось бы получить только:

[email protected], [email protected], SIZE=1227, CLIENT=10.10.10.10


PM MAIL   Вверх
alezzz
Дата 23.12.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



treee
Код

if (($all=~ m /from=/i) or ($all=~ m /to=/i) or ($all=~ m /client=/i))
{
   my $id = $1;

$id не получает значения, т.к. в $1 пусто после проверок в if() двумя строчками выше и после этого в хеше всего 1 ключ и тот пустой, а саму проверку мне кажется можно упростить до m /(from|to|client)=/i.
Попробуйте еще на разных этапах поставить print с разными переменными, отладить программу.

ginnie, а чем именно лучше? Оба выражения по смыслу одинаковы. В вашем варианте не будет проверки на совпадение .* после нахождения reject и сама проверка продет быстрее?
PM MAIL   Вверх
ginnie
Дата 23.12.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



alezzz, да, проверка пройдет быстрее. Попробуйте добавить в код use re 'debug'; для наглядности.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
alezzz
Дата 23.12.2010, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



ginnie, спасибо, почитаю, попробую.
PM MAIL   Вверх
treee
Дата 24.12.2010, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



alezzz, 
Спасибо большое за помощь, нашёл косяк, не там my $id = $1; влепил, его надо чуть повыше поставить и тогда всё ОК.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




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


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

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