icarus уже ответил на этот вопрос в awk
, так что вот как извлечь дату и идентификатор в переменные, а данные события в хэш (ассоциативный массив )с помощьюperl
:
#!/usr/bin/perl -l
use strict;
while(<>) {
if (m/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}).+?\sID\s(\[\d{4}\]).*?Data -> (.*)$/) {
my ($date,$id,$eventdata) = ($1,$2,$3);
print $date;
print $id;
# decorate the key names with a tab (i.e. add a tab before each)
$eventdata =~ s/([^[:blank:]]+) *= */\t$1=/g;
# remove tab from beginning of $eventdata
$eventdata =~ s/^\t//; #/
# split $eventdata on tabs, and split again into key=value pairs
# and store in %data hash.
my %data = map { my($k,$v) = split("=",$_,2); $k => $v } split(/ *\t/,$eventdata);
foreach my $key (sort keys %data) { printf "%s=%s\n", $key, $data{$key} };
};
};
(Комментарий #/
предназначен только для исправления неработающей подсветки синтаксиса Perl U&L)
Обратите внимание, что ,2
в конце операции split("=",$_,2)
каждая пара ключ=значение разбивается максимум на два поля :все до первого=
символ и все, что после него. Это означает, что не имеет значения, содержит ли значение символ =
. Такие вещи гораздо проще сделать в perl, чем в awk. Работа с регулярными выражениями и группами захвата также упрощается, как показано в первых двух строках в начале цикла while(<>)
.
Сохранить как, например. kei.pl
, сделайте его исполняемым с помощью chmod +x kei.pl
и запустите так:
$./kei.pl input
2017-03-21T02:00:00
[4624]
AuthenticationPackageName=Negotiate
ImpersonationLevel=%%1122
IpAddress=10.0.0.0
IpPort=10.5.3.2
KeyLength=0
LmPackageName=Stainless
LogonGuid={00344000-0000-0000-0000-0000000003440}
LogonProcessName=Lxxoi
LogonType=8
ProcessId=0x0000000000000244
ProcessName=C:/Windows/System32/services.exe
SubjectDomainName=WORKGROUP
SubjectLogonId=0x00000000000004j7
SubjectUserName=PRETENDERS$
SubjectUserSid=S-1-5-18
TargetDomainName=NT AUTHORITY
TargetLogonId=0x00000000000003e7
TargetUserName=SYSTEMS
TargetUserSid=X-12-54-181
TransmittedServices=-
WorkstationName=-
Кстати, если вы хотите, чтобы дата и идентификатор также были в хеше, добавьте следующее после строки %data = map...
(и удалите строки print $date;
и print $id;
:
$data{'DATE'} = $date;
$data{'ID'} = $id;