Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Обработка лога


Автор: tematire 19.11.2013, 15:14
Здравствуйте! Сразу скажу, я только начинаю изучать Perl и читаю книгу "Изучаем Perl"  smile
На работе дали задание отсортировать лог, в котором отражена информация о входе пользователей в систему. 
С помощью скрипта получилось избавить лог от "воды". Плюс, делю лог на два файла - с ошибками и без них.
Код

$ofile = "log.txt"; $outlg = "lg-" . $ofile; $outer = "er-" . $ofile;
open (IN, "<$ofile") || die "Can't open: $!";
open (OUT1, ">$outlg") || die "Can't open: $!";
while (<IN>){$p1 = qr/(dl login: LOGIN ON pts.*? BY)/; $r1 = "Login:"; s/$p1/$r1/; 
$p2 = qr/(FROM)/; $r2 = "PC:";s/$p2/$r2/;print OUT1 $_ if $_=~/Login:/;} close IN; close OUT1;
open (IN, "<$ofile") || die "Can't open: $!";
open (OUT2, ">$outer") || die "Can't open: $!";
while (<IN>){$p1 = qr/(dl login: FAILED LOGIN .*? FROM)/; $r1 = "Failed from:"; s/$p1/$r1/;
print OUT2 $_ if $_=~/(Failed from:)/;} close IN; close OUT2;

Далее загонял лог (который без ошибок) в excel, ну а там уже ручками.. 
Нужен скрипт, который будет выписывать из лога нарушителей т.е. тех пользователей, кто вошел более чем с 1 компьютера в день!
Подскажите пожалуйста, я голову ломаю не знаю как это написать!  smile 
Запись в логе вот такая:

Aug 25 09:52:09 Login: msslo PC: 192.168.19.100
Aug 25 10:05:07 Login: msslo PC: 192.168.26.26
Aug 25 10:09:12 Login: samak PC: 192.168.26.50
Aug 25 10:14:13 Login: nochi PC: 192.168.26.10
Aug 25 10:29:43 Login: nochi PC: 192.168.26.10
Aug 26 09:35:04 Login: samak PC: 192.168.25.50
Aug 26 10:32:18 Login: nochi PC: 192.168.26.10
Aug 27 09:51:41 Login: mnbus PC: 192.168.26.26
Aug 27 11:04:06 Login: mnbus PC: 192.168.26.26
Aug 28 09:11:25 Login: msslo PC: 192.168.19.100

Автор: reiserford 19.11.2013, 19:17
написал пока жду ответ на своё письмо
Код

use common::sense; 
my $data = q|
Aug 25 09:52:09 Login: msslo PC: 192.168.19.100
Aug 25 10:05:07 Login: msslo PC: 192.168.26.26
Aug 26 09:35:04 Login: samak PC: 192.168.25.50
|;
my %users;
foreach (grep {/\S/} split /\n/, $data) {
    m/Login:\s(.+?)\sPC:\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
    $users{$1}{$2}++;
}
say join "\n", grep {$_ =~ /\S/ && scalar(keys %{$users{$_}}) > 1} keys %users;

Автор: tematire 2.12.2013, 13:26
Спасибо за ответ! А я с ответом затянул, извиняюсь...
Я не точно сформулировал, что требовалось) Нужно выписать в файл строку с нарушителем целиком (событие, дата, с какого пк и тп)
Код опробовал, но выводит он только это (Лог файл в *.txt, запись лога показана выше):
Цитата

msslo

т.е. только имя
Но код работает, за это спасибо! 
Я немного видоизменил его
Код

open my $fh, '<', $file || die;
$/ = undef;
my $data = <$fh>;
my %users;
foreach (grep {/\S/} split /\n/, $data) {
    m/Login:\s*(.+?)\sPC:\s*(\d+\.\d+\.\d+\.\d+)/;
    $users{$1}{$2}++;
close $fh;
} 
say OUT join "\n", grep {$_ =~ /\S/ && scalar(keys %{$users{$_}}) > 1}keys %users;

 smile 

Автор: tishaishii 3.12.2013, 18:09
Код
open( my $fh, '<', $file ) || die($!);
my %users;
m/Login:\s*(.+?)\sPC:\s*(\d+\.\d+\.\d+\.\d+)/ and $users{$1}{$2} ++ while <$fh>;
print($_, "\n") foreach keys(%users);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)