Привет всем
Есть логфайл состоящий из записей вида "$date $time: $log_text"
формат $date $time нам известен
$log_text - может быть многострочнымподскажите плиз как из этого файла выудить каждую такую запись с помощью регекспа. В смысле мне нужно поочередно вынуть каждую запись и обработать ее.
сильно не пинайте плиз
с Perl только знакомлюсь
>Привет всем
>Есть логфайл состоящий из записей вида "$date $time: $log_text"
>формат $date $time нам известен
>$log_text - может быть многострочнымЕсли формат $date/$time неизвестен, там может быть что угодно, в том числе переводы строк, двоеточие и любые другие символы, тогда задача не решаема.
Советую подумать насчет того, как представить дату/время в виде регэкспа или набора регэкспов. Вот пример для записей вида
YYYY-MM-DD HH:MM:SS: text
text
textwhile(<STDIN>) {
my $date, $text;
if (/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}): (.*)/) {
process_entry($date, $text) if (defined $date && defined $text);
$date = $1;
$text = $2;
} else {
$text .= $2;
}
}process_entry($date, $text) if (defined $date && defined $text);
sub process_entry {
my($date, $text) = @_;
# обработка записи
}Если дата в сложном формате - вопрос только в том, чтобы узнать, начинается строка с даты или нет. Это может быть набор регэкспов иил что-то другое, вам виднее.
Звиняюсь.>while(<STDIN>) {
> my $date, $text;my $date, $text, разумеется, должны быть объявлено перед while.
Спасибо агромное :)
саму идею понялформат $date/$time нам известен - составить под него регексп не проблема
А можно ли работать с этим логом не с каждой строчкой отдельно - а как с мультилайном?
И одним регекспом выкусывать оттуда нуобходимые записи?
>А можно ли работать с этим логом не с каждой строчкой отдельно
>- а как с мультилайном?
>И одним регекспом выкусывать оттуда нуобходимые записи?Наверное можно, только нужно ли? По сколько нужно будет читать из лога, чтобы все сообщение влезло? Придется дополнительно писать работу с буфферами. multiline регэкспы предпочитаю вообще не использовать.
Если этот регекс не сработает:
> if (/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}): (.*)/) {то в $2 будет undef и следующая строка не верна:
> $text .= $2;Ее стоит заменить на
$text.=$_;Альтернативно можно первый захват сделать условным поставив после него "?", но тогда проверять на пустоту $1
Простая иллюстрация всех случаев:
$ perl -le '$_="ab";/(a)(b)/; print "1:$1 2:$2"'
1:a 2:b
$ perl -le '$_="b";/(a)(b)/; print "1:$1 2:$2"'
1: 2:
$ perl -le '$_="b";/(a)?(b)/; print "1:$1 2:$2"'
1: 2:b
$ perl -le '$_="ab";/(a)?(b)/; print "1:$1 2:$2"'
1:a 2:b
>Ее стоит заменить на
>$text.=$_;Угу.