Выбор языка (обработка log-файлов)

Модератор: Модераторы разделов

petrushka_sch2
Сообщения: 252
ОС: Mandriva 2007.1

Выбор языка

Сообщение petrushka_sch2 »

Дано:
есть log-файл, где подряд идут строки по 5-10 разным шаблонам, примеры:
[15.01.2008 13:42:19.341] player 10002222 entered inn id=17, (39, 124)
[15.01.2008 14:22:25.982] player 123243546576 entered building id=24, (44, 128)
[15.01.2008 14:22:30.654] player 123243546576 left building
[15.01.2008 14:26:57.763] error found! 0x005573e0 -> 0x00557419

Задача:
Отловить две подряд идущие для конкретного player'а (т.е. между ними могут быть события для других player'ов) одинаковые строки:
[15.01.2008 13:42:19.341] player 10002222 entered inn id=17, (39, 124)
либо
[15.01.2008 13:42:19.341] player 10002222 entered building id=17, (39, 124)
И выцепить оттуда 10002222
Например:
[15.01.2008 13:42:19.654] player 10002222 entered inn id=17, (39, 124)
[15.01.2008 14:22:30.654] player 123243546576 left building
[15.01.2008 13:42:19.654] player 10002222 entered inn id=17, (39, 124)

Строчки выделенные жирным для player'а 10002222 идут подряд, несмотря на то, что между ними вклинилось событие другого player'а.
Программа\скрипт должна выцепить из этого входа 10002222


Понятно, что можно это сделать с помощью c\c++, но просто, во-первых, хочется изучить какой-нибудь новый язык, а во-вторых, хочется использовать инструмент для обработки текста.

Был бы очень благодаерен за советы и направления куда копать.
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: Выбор языка

Сообщение Poor Fred »

petrushka_sch2 писал(а):
19.01.2008 12:21
Понятно, что можно это сделать с помощью c\c++, но просто, во-первых, хочется изучить какой-нибудь новый язык, а во-вторых, хочется использовать инструмент для обработки текста.

Был бы очень благодаерен за советы и направления куда копать.

grep, perl
Убить всех человеков!
Спасибо сказали:
petrushka_sch2
Сообщения: 252
ОС: Mandriva 2007.1

Re: Выбор языка

Сообщение petrushka_sch2 »

А можно с грепом поподробнее? Я пытался с помощью него наваять, но ни малейшеей идеи как отловить тот факт что две строчки (в общем случае, идущие не подряд) одинаковы с помощью grep. А насчет перла, почему именно perl?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Выбор языка

Сообщение diesel »

несколько непонятен вопрос. у тебя есть логфайл, тебе с него надо выцепить просто все цифры которые идут за player? - в таком случае это достаточно несложно сделать с помощью стандартных unix-tools. тебе надо выцепить id которые встречаются в файле _исключительно_ два раза, не больше и не меньше? если исключительно два раза, то есть ли граница "близости" этих строк - т.е. через строчку - это еще подряд, если 10 строчек - то уже не надо, или возможно на дату надо смотреть?

почему Perl? - потому что он в достаточной мере удобен для работы с текстом, в конце-концов его для этого делали.
Спасибо сказали:
petrushka_sch2
Сообщения: 252
ОС: Mandriva 2007.1

Re: Выбор языка

Сообщение petrushka_sch2 »

Мне нужно отлавливать следующее событие:
Если конкретный player два раза подряд entered inn id=17, (39, 124), то мне нужно знать id player'а. Причем, если между этими двумя разами какие-то события происходили с другими player'ами - мне все равно.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Выбор языка

Сообщение diesel »

ну если в перловых выражениях то первое что приходит в голову, это делаем хэш, формата player id=>action, и идем по логу :) ежели данный плейер в хэше есть и экшн такой же - печатаем, если экшн другой - заменяем новым, если нет ... то добавляем нового плейера-экшин(ну с этим нет проблем).
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: Выбор языка

Сообщение Poor Fred »

petrushka_sch2 писал(а):
19.01.2008 12:39
А можно с грепом поподробнее?

Ну в общем случае, без привязки к твоей задаче:

Код: Выделить всё

grep "your_expr" file.txt

или

Код: Выделить всё

cat file.txt | grep "your_expr"
Убить всех человеков!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Выбор языка

Сообщение /dev/random »

Если файл уже "готовый", и не требуется работать с потоком:

Код: Выделить всё

sort файл | uniq -d | sed 's/.*player \([[:digit:]]*\).*/\1/'
Спасибо сказали:
petrushka_sch2
Сообщения: 252
ОС: Mandriva 2007.1

Re: Выбор языка

Сообщение petrushka_sch2 »

/dev/random писал(а):
19.01.2008 15:16
Если файл уже "готовый", и не требуется работать с потоком:

Код: Выделить всё

sort файл | uniq -d | sed 's/.*player \([[:digit:]]*\).*/\1/'


Не получится, т.к. строчки не совсем одинаковые -вначале каждой строки стоит дата и время...
Спасибо сказали:
petrushka_sch2
Сообщения: 252
ОС: Mandriva 2007.1

Re: Выбор языка

Сообщение petrushka_sch2 »

Poor Fred писал(а):
19.01.2008 14:48
petrushka_sch2 писал(а):
19.01.2008 12:39
А можно с грепом поподробнее?

Ну в общем случае, без привязки к твоей задаче:

Код: Выделить всё

grep "your_expr" file.txt

или

Код: Выделить всё

cat file.txt | grep "your_expr"


Согласись, бесполезный ответ :) Это знает почти каждый, кто открывал терминал.

/dev/random писал(а):
19.01.2008 15:16
Если файл уже "готовый", и не требуется работать с потоком:

Код: Выделить всё

sort файл | uniq -d | sed 's/.*player \([[:digit:]]*\).*/\1/'


А в общем, супер! Огромное спасибо за наводку.

diesel писал(а):
19.01.2008 13:15
ну если в перловых выражениях то первое что приходит в голову, это делаем хэш, формата player id=>action, и идем по логу :) ежели данный плейер в хэше есть и экшн такой же - печатаем, если экшн другой - заменяем новым, если нет ... то добавляем нового плейера-экшин(ну с этим нет проблем).

Спасибо и здесь :) Попробую оба способа )

/dev/random писал(а):
19.01.2008 15:16
Если файл уже "готовый", и не требуется работать с потоком

Кстати, а если с потоком - какой совет?
Спасибо сказали:
petrushka_sch2
Сообщения: 252
ОС: Mandriva 2007.1

Re: Выбор языка

Сообщение petrushka_sch2 »

sort файл | uniq -d | sed 's/.*player \([[:digit:]]*\).*/\1/'

Понял, что не поможет, т.к. при сортировке файла (если не учитывать первый два поля: дату и время) потеряется порядок событий, и уже нельзя будет сказать, подряд они были для данного Player'a или нет
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Выбор языка

Сообщение /dev/random »

Чтобы порядок не потерялся, нужно вызывать sort с ключами -s (стабильная сортировка) и -k 4,4 (а не -k 4) (чтобы учитывалось ТОЛЬКО четвертое поле, а не все начиная с четвертого).
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Выбор языка

Сообщение Folderx »

Работает для разных плееров, на больших логах не проверял.

Загрузка не сработала
http://ifolder.ru/5036172
Спасибо сказали:
petrushka_sch2
Сообщения: 252
ОС: Mandriva 2007.1

Re: Выбор языка

Сообщение petrushka_sch2 »

Спасибо!
Спасибо сказали: