The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Разбить лог регулярными выражениями"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

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

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

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

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Разбить лог регулярными выражениями"  
Сообщение от Guest (??) on 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) = @_;
  # обработка записи
}

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Разбить лог регулярными выражениями"  
Сообщение от Guest (??) on 18-Авг-08, 17:24 
Звиняюсь.

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Разбить лог регулярными выражениями"  
Сообщение от angra (ok) on 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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

Угу.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру