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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как разобрать данные в файле? две записи в 1-м файле -> одна во 2-м 
V
    Опции темы
witos
Дата 22.3.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



помогите чайнику, который только начал разбираться с perl...

Есть лог-файл следующего вида:

Sun Mar 19 23:18:54 YEKT 2006 ppp3 10.6.20.250 LOGIN
Sun Mar 19 23:32:27 YEKT 2006 ppp3 10.6.20.250 LOGOUT
Mon Mar 20 19:49:45 YEKT 2006 ppp3 10.6.20.250 LOGIN
Mon Mar 20 20:28:25 YEKT 2006 ppp3 10.6.20.250 LOGOUT
Tue Mar 21 20:52:02 YEKT 2006 ppp3 10.6.20.250 LOGIN
Tue Mar 21 20:52:06 YEKT 2006 ppp3 10.6.20.250 LOGOUT
Tue Mar 21 20:52:25 YEKT 2006 ppp3 10.6.20.250 LOGIN
Tue Mar 21 20:54:05 YEKT 2006 ppp5 10.6.20.240 LOGIN
Tue Mar 21 20:56:01 YEKT 2006 ppp5 10.6.20.240 LOGOUT
Tue Mar 21 20:56:33 YEKT 2006 ppp3 10.6.20.250 LOGOUT
Tue Mar 21 20:58:46 YEKT 2006 ppp3 10.6.20.250 LOGIN
Tue Mar 21 21:37:17 YEKT 2006 ppp3 10.6.20.250 LOGOUT

нужно занести данные в файл, чтоб строки выглядели так - " IP-адрес pppX login_date_time logout_date_time", т.е.
как сделать из 2-х записей в исходном лог-файле (вход и выход) одну в другом файле со временем и входа, и выхода?
( т.е. чтоб получить записи вида:
10.6.20.250 ppp3 19.03.2006 23:18:54 19.03.2006 23:32:27
10.6.20.250 ppp3 20.03.2006 19:49:45 20.03.2006 20:28:25
и т.д.)
PM MAIL   Вверх
DEER
Дата 22.3.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

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



Код

 open(INFILE, ">Log.txt");
 open(FILE, "MyFile.txt");
 my $text = <FILE>;
 while($text=~/(\w*\s\w*\s\d*\s\d*\:\d*\:\d*).*?(ppp.)\s(\d*\.\d*\.\d*\.\d*)\sLOGIN/g)
 {
    my $login_date = $1;
    my $logout_date = "";
    my $ppp = $2;
    my $ip = $3;
    if($text=~/$login_date.*?(\w*\s\w*\s\d*\s\d*\:\d*\:\d*).*?$ppp\s$ip\sLOGOUT/)
    {
           $logout_date = $1;
           print <INFILE> "$ip $ppp $login_date $lodout_date";
    }
 }

нужно что то типа такого.... это работать не будет, но если подкорректировать, то можно добиьбся результата smile

Это сообщение отредактировал(а) DEER - 22.3.2006, 14:49


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
witos
Дата 22.3.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хорошо, попробую подкорректировать
PM MAIL   Вверх
nitr
Дата 22.3.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



Вот держи на скорую руку (рабочий но глупый):
Код

#!/usr/bin/perl -w
use strict;
my $filein = 'in.log';
my $fileout = 'out.log';
my ($login_date, $logout_date, $ppp, $ppp1, $ip, $ip1);
open OUT, ">$fileout";
open LOG, "<$filein";
while(<LOG>) {
  if(m/(\w+\s\w+\s\d+\s\d+\:\d+\:\d+).+?(ppp.)\s(\d+\.\d+\.\d+\.\d+)\sLOGIN/) { 
    $login_date = $1;
    $ppp = $2;
    $ip = $3;
  }
  if(m/(\w+\s\w+\s\d+\s\d+\:\d+\:\d+).+?(ppp.)\s(\d+\.\d+\.\d+\.\d+)\sLOGOUT/) {
    $logout_date = $1;
    $ppp1 = $2;
    $ip1 = $3;
    print OUT "$ip $ppp $login_date $logout_date\n";
  }
}
close(LOG);
close(OUT);


Это сообщение отредактировал(а) nitr - 22.3.2006, 21:31


--------------------
PM   Вверх
DEER
Дата 22.3.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

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



nitr, но не факт, что записи подключения\отключения идут поочереди smile


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
nitr
Дата 22.3.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



Этот скрипт можно улучшить, у меня щас времени нет. Я написал на скорую руку. Твой код не проверял smile


--------------------
PM   Вверх
witos
Дата 22.3.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



DEER, это правильно подмечено, поэтому
слегка изменил код nitr, по результатам вроде похоже на правильный вид...

#!/usr/bin/perl -w
use strict;
my $filein = 'vpn.log';
my $fileout = 'my.log';
my ($login_date, $logout_date, $ppp, $ip);
open OUT, ">$fileout";
open LOG, "<$filein";
while(<LOG>) {
if(m/(\w+\s\w+\s\d*\s\d*\:\d*\:\d*).*?(ppp.)\s((\d*\.){3}\d*)\sLOGIN/) {
$login_date = $1;
$ppp = $2;
$ip = $3;
}
if ((m/(\w*\s\w*\s\d*\s\d*\:\d*\:\d*).*?(ppp.)\s(\d*\.){3}\d*\sLOGOUT/) and ($ppp eq $2)) {
$logout_date = $1;
print OUT "$ip $ppp $login_date $logout_date\n";
}
}
close(LOG);
close(OUT);

тогда остаётся только дату привести в красивый вид...

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


Новичок



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

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



Tue Mar 21 20:52:25 YEKT 2006 ppp3 10.6.20.250 LOGIN
Tue Mar 21 20:54:05 YEKT 2006 ppp5 10.6.20.240 LOGIN
Tue Mar 21 20:56:01 YEKT 2006 ppp5 10.6.20.240 LOGOUT
Tue Mar 21 20:56:33 YEKT 2006 ppp3 10.6.20.250 LOGOUT

для приведенного отрезка данных с вышеуказанным кодом теряется запись для ррр3, т. к. переменым будут присвоенны данные от ррр5.

необходимо данные ввести в массив


PM MAIL   Вверх
nitr
Дата 23.3.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



А можно предварительно лог-файл обработать и сделать чтобы по порядку записи были smile Думаю даже быстрей будет, т.к. остануться теже рег. выры ;)


--------------------
PM   Вверх
Бонифаций
Дата 23.3.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я бы сделал так:

Код

#!/usr/bin/perl

while (<>) {
  # убираем концевые пробелы
  s/^\s+//; s/\s+$//;
  # пропускаем пустые строки
  next if /^$/;
  # делим строку лога на значения
  my ( $dow, $month, $day, $time, $tz, $year, $line, $ip, $action) = split /\s+/;
  if ($action eq "LOGIN") {
      $lines{$line} = "$ip $line $month $day $time";
   } elsif ($action eq "LOGOUT") {
      print $lines{$line}," -  "," $month $day $time\n";
   }

}




Вот результат который получился на вашем примере:

10.6.20.250 ppp3 Mar 19 23:18:54 - Mar 19 23:32:27
10.6.20.250 ppp3 Mar 20 19:49:45 - Mar 20 20:28:25
10.6.20.250 ppp3 Mar 21 20:52:02 - Mar 21 20:52:06
10.6.20.240 ppp5 Mar 21 20:54:05 - Mar 21 20:56:01
10.6.20.250 ppp3 Mar 21 20:52:25 - Mar 21 20:56:33
10.6.20.250 ppp3 Mar 21 20:58:46 - Mar 21 21:37:17


Это сообщение отредактировал(а) Бонифаций - 23.3.2006, 13:03


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
witos
Дата 23.3.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И правда, что ранее написаный код терял записи....
Спасибо Бонифаций, ваш код на самом деле выдал правильный результат!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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