Я вижу вашу двухэтапную проблему: вы хотите проанализировать файлы журналов, но затем вы также хотите сохранить элементы этих данных в структуре данных, которую вы можете использовать для подсчета.
Это предположение, основанное на ваших образцах данных, но если ваши данные имеют фиксированную ширину, один из способов разбить их на поля - использовать unpack
.Я думаю, что substr
может быть более эффективным, поэтому подумайте, сколько файлов вам нужно проанализировать и как долго каждый из них.
Я бы сохранил данные в хеш, а затем разыменовал их после прочтения всех файлов.
my %counts;
open my $IN, '<', 'logfile.txt' or die;
while (<$IN>) {
next if length ($_) < 51;
my ($sid, $user, $terminal, $program) = unpack 'A9 @11 A25 @37 A15 @53 A25', $_;
next if $sid eq '---------'; # you need some way to filter out bogus or header rows
$program =~ s/\(.+//; # based on your example, turn toto (fifi) into toto
$counts{$user}{$program}++;
}
close $IN;
while (my ($user, $ref) = each %counts) {
while (my ($program, $count) = each %$ref) {
print "User = $count $user with program $program\n";
}
}
Вывод из программы:
User = 3 SYSTEM with program toto
User = 1 SYSTEM with program gogo
User = 1 NT_AUTHORITY\SYSTEM with program roro
User = 1 NT_AUTHORITY\SYSTEM with program gaga