URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7550
[ Назад ]

Исходное сообщение
"Разбить лог регулярными выражениями"

Отправлено Retiff , 18-Авг-08 16:43 
Привет всем
Есть логфайл состоящий из записей вида "$date $time: $log_text"
формат $date $time нам известен
$log_text - может быть многострочным

подскажите плиз как из этого файла выудить каждую такую запись с помощью регекспа. В смысле мне нужно поочередно вынуть каждую запись и обработать ее.

сильно не пинайте плиз
с Perl только знакомлюсь


Содержание

Сообщения в этом обсуждении
"Разбить лог регулярными выражениями"
Отправлено Guest , 18-Авг-08 17:22 
>Привет всем
>Есть логфайл состоящий из записей вида "$date $time: $log_text"
>формат $date $time нам известен
>$log_text - может быть многострочным

Если формат $date/$time неизвестен, там может быть что угодно, в том числе переводы строк, двоеточие и любые другие символы, тогда задача не решаема.

Советую подумать насчет того, как представить дату/время в виде регэкспа или набора регэкспов. Вот пример для записей вида

YYYY-MM-DD HH:MM:SS: text
text
text

while(<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) = @_;
  # обработка записи
}

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


"Разбить лог регулярными выражениями"
Отправлено Guest , 18-Авг-08 17:24 
Звиняюсь.

>while(<STDIN>) {
>  my $date, $text;

my $date, $text, разумеется, должны быть объявлено перед while.


"Разбить лог регулярными выражениями"
Отправлено Retiff , 18-Авг-08 17:58 
Спасибо агромное :)
саму идею понял

формат $date/$time нам известен - составить под него регексп не проблема

А можно ли работать с этим логом не с каждой строчкой отдельно - а как с мультилайном?
И одним регекспом выкусывать оттуда нуобходимые записи?


"Разбить лог регулярными выражениями"
Отправлено Guest , 18-Авг-08 19:01 
>А можно ли работать с этим логом не с каждой строчкой отдельно
>- а как с мультилайном?
>И одним регекспом выкусывать оттуда нуобходимые записи?

Наверное можно, только нужно ли? По сколько нужно будет читать из лога, чтобы все сообщение влезло? Придется дополнительно писать работу с буфферами. multiline регэкспы предпочитаю вообще не использовать.


"Разбить лог регулярными выражениями"
Отправлено angra , 18-Авг-08 19:46 
Если этот регекс не сработает:
>  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


"Разбить лог регулярными выражениями"
Отправлено Guest , 18-Авг-08 20:10 
>Ее стоит заменить на
>$text.=$_;

Угу.