Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PERL анализ тектового файла / 13 сообщений из 13, страница 1 из 1
17.06.2014, 19:45
    #38672325
Kushtym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
Ув. коллеги, стоит задача анализировать текстовый лог файл с помощью Perl, я в нем не шарю, нид хелп.

Файл с именем 1.txt, постоянно наполняется (появляются новые строки), данные разделены пробелами, надо анализировать только один блок, при совпадении этого блока в строке - отсылать мыло.

Пример файла 1.txt

1111 22222222 333 1 - 0 - 7676 - jkh.sd hd/3242.dfs 7777 655 12 lkjsd
98676 askdhajk 1231 321 lkjxcv 9323 dfsf 56464 sdfsdfs - - - 123111 dfsf 222121
(и так далее)

Необходимо, при совпадении блока, например, номер 11 (то есть в первой строке - это значение "7777", во второй "-") со значением, например "1111" отсылалось уведомление на почту, все остальыне блоки анализировать не надо.
Еще, ситуация такая, необходимо помнить старые значения, то есть анализировать только новые строки с последнего визита скрипта.

Как-то так, задача в несколько строк, но не могу сообразить, регулярные выражения меня убиваю, подмогните плиз.
...
Рейтинг: 0 / 0
17.06.2014, 19:48
    #38672328
Kushtym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
Простите, речь шла про блок номер 12, но в общем это не принципиально, ключевой момент, что анализировать один блок, все строки и после только новые с последующим уведомлением
...
Рейтинг: 0 / 0
18.06.2014, 01:45
    #38672466
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
В принципе, подобный анализ однострочником на awk можно реализовать. Вроде не слишком сложно.
Еще не понятно, как скрипт должен узнать, на которой строке он остановился в прошлый раз - где-то в отдельном файле хранит номер последней проверенной строки, или между запусками скрипта в файл добавляется строго определенное к-во строк (тогда можно читать/проверять только последние N+1 строк), что-то другое? Что делать, если в проверяемых строках будет не одно, а несколько изменений? Что делать, если файл очищен (в файле меньше строк, чем было в прошлый визит)?
...
Рейтинг: 0 / 0
18.06.2014, 18:08
    #38673443
Kushtym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
vkle,

спс за овтет, я так понимаю, что можно использовать якорь, то есть если где-то есть якорь - начинать с него, если нет, начинать с начала, второй вариант - можно менять/удалять совпадения, то есть вместо найденого ставть "OK" или "FOUND" и все, и каждый раз прогонять логи (хотя это конечно нихрена не оптимально, а логов будет хватать).
...
Рейтинг: 0 / 0
18.06.2014, 22:12
    #38673646
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
Kushtymя так понимаю, что можно использовать якорь, то есть если где-то есть якорь - начинать с негоВ смысле... вносить изменение в существующий файл? Надеюсь, я ошибся.

Kushtymа логов будет хвататьОпс! Можно озвучить предполагаемые объемы файла? Как насчет ротации логов?

Гхм... Попробую предложить такой вариант, конечно, если это не противоречит каким-то другим требованиям... При наличии ротации можно парсить только файл text.log.1 - последний полный срез. А сам парсинг запускать сразу после ротации. Таким образом, проблема запоминания строки исчезает автоматически. Последнее предыдущее значение (необходимое для анализа первой строки) брать из последней строки файла text.log.2.
...
Рейтинг: 0 / 0
19.06.2014, 07:08
    #38673773
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
Kushtym,

если 1.txt файл постоянно наполняетс я, то есть, открыт другим процессом на запись,
сомнительно, что удастся поиметь к нему доступ перл-скриптом для нанесения метки - якорь ,
да и зачем, проще использовать свой файл с меткой - номером последней удачной строки.

а вот и однострочник, но отображенный в 10 строках
[
скопировать - вставить - запустить.
если под unix.
а если под windows, поменять местами двойные и одинарные кавычки и вытянуть всё в одну строку
]

Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
perl -ane '

BEGIN {

    sub get_anchor  { open F, "<", "_tmp_" || return 0; return <F>; }

    sub set_anchor  { open F, ">", "_tmp_" or die $!; print F $.; close F; }

    sub sendmail    { print qq/Found $tag in line $.\n/; }

    sub  action     { set_anchor; sendmail }

    our $tag        = "7777";

    our $anchor     = get_anchor;

}

do { action and exit } if ( $F[11] eq $tag ) and ( $. > $anchor );

' 1.txt



Код: coco
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
используемые опции запуска Perl:
-a  - расщепляет строки входного файла на слова и кладёт в массив @F
-n  - обрабатывает в цикле строки входного файла
-e  - собственно содержание скрипта для исполнения

переменные:  
$tag    - что искать
$F[11] - двенадцатое поле в строке, разделенной пробелами

домашнее задание:
в sub sendmail() вставить `команду отправки почты` вместо print
...
Рейтинг: 0 / 0
19.06.2014, 15:59
    #38674504
Kushtym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
vkle, volodin661, да, вы правы наверное с ситуацией на счет наполнения, наверное это неправильно.
volodin661 персональное благодарю за скрипт, еще не запускал, буду осваивать, результат выложе тут (под результатом имеется и отправка почты и определение актуального лога для анализа)
этот парсер будет запускаться многократно в течении дня, каждый новый день - новый лог.

У меня еще промежуточный микро вопрос (после разбора скорей всего отпадет, но все же), не будет ли никаких проблем, при одновременном запуске 10 таких скриптов, но нацеленных на разные логи? то есть не будет ли проблем с темповыми файлами, сами темповые файлы будут оставаться? - уважаемые коллеги, на все эти вопросы я буду искать ответы в процессе разбора

Еще раз спасибо - вы мне дали точку опоры, дальше будет проще :)
...
Рейтинг: 0 / 0
19.06.2014, 16:29
    #38674534
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
Kushtymпарсер будет запускаться многократно в течении дня, каждый новый день - новый лог.Не понятно. Под новым логом Вы имеете в виду новую порцию данных для обработки?

Kushtymне будет ли проблем с темповыми файлами, сами темповые файлы будут оставаться?Из ниоткуда временные файлы не берутся. Будете создавать их и не будете удалять - тогда и будут оставаться. Если временные файлы используются, то нужно предусмотреть механизмы их удаления.

Kushtymне будет ли никаких проблем, при одновременном запуске 10 таких скриптов, но нацеленных на разные логи?Не должно быть, если только не потребуется одновременный доступ на запись к какому то одному файлу. Впрочем, это тоже отчасти решаемо.
...
Рейтинг: 0 / 0
19.06.2014, 16:59
    #38674565
Kushtym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
ув. vkle, тут были больше вопросы по скрипту господина volodin661, который писал
volodin661да и зачем, проще использовать свой файл с меткой - номером последней удачной строки.
vkleИз ниоткуда временные файлы не берутся. Будете создавать их и не будете удалять - тогда и будут оставаться. Если временные файлы используются, то нужно предусмотреть механизмы их удаления
я вот про эти файлы темповые ("свои файлы") спрашивал

vkleНе понятно. Под новым логом Вы имеете в виду новую порцию данных для обработки?
скрипт должен парсить каждые 10 минут один лог в течении одних суток, лщог при этом постоянно наполняется, со сменой суток создается новый лог - который этот же скрипт будет парсить следующие сутки

на текущем этапе я просто пытаюсь запустить скрипт (про одну строку - это было образное выражение), действуя по инструкии господина volodin661 я пока получю болт, естественно скорей всего дело в моих руках...я уже по разному пытался со скобочками играть

perl -ane ' BEGIN {sub get_anchor { open F, '<', '_tmp_' || return 0; return <F>; } sub set_anchor { open F, '>', '_tmp_' or die $!; print F $.; close F; } sub sendmail { print qq/Found $tag in line $.\n/; } sub action { set_anchor; sendmail } our $tag = '500'; our $anchor = get_anchor;} do { action and exit } if ( $F[11] eq $tag ) and ( $. > $anchor ); ' 1.txt
...
Рейтинг: 0 / 0
19.06.2014, 17:16
    #38674590
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
Kushtymя вот про эти файлы темповые ("свои файлы") спрашивалЭтот файл я бы не назвал временным. Он же содержит информацию для следующего запуска скрипта. Вполне такой рабочий и нужный файл.

Kushtymскрипт должен парсить каждые 10 минут один лог в течении одних сутокОтметки времени в логе не предусмотрены? Если метки есть, то можно на них ориентирваться. Конечно, при таком варианте появляется опасность пропустить что-то в случае, когда запуск скрипта не удался по какой-то причине.
...
Рейтинг: 0 / 0
19.06.2014, 19:26
    #38674743
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
Kushtym,

ага.. значит всё-таки под Windows.


однострочник оставляем в покое, в данном случае это было больше эстетство,
а не практическая необходимость

Код: coco
1.
2.
3.
файл 1.pl :

запуск: perl 1.pl 1.txt


Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
use strict;

my $tag     = "7777";
my $file    = "_anchor_";
my $anchor  = get_anchor();

while ( <> ) {
    
    if ( (split)[11] eq $tag
            and
         $. > $anchor )
    {  
        action();
        last;
    }
}

sub get_anchor  { open F, "<", $file or return 0; return <F> }
sub set_anchor  { open F, ">", $file or die $!;   print F $.; close F }
sub sendmail    { print "Found $tag in line $.\n" }
sub action      { set_anchor(); sendmail() }
...
Рейтинг: 0 / 0
19.06.2014, 19:45
    #38674749
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
Kushtym я просто пытаюсь запустить скрипт (про одну строку - это было образное выражение), действуя по инструкии господина volodin661 я пока получю болт


просто невнимательно прочитал инструкцию г-на Volodin661 ,
который откровенно и не стесняясь в выражениях указал, что в случае Уиндус двойные и одинарные кавычки меняются местами.
( це отличие интерпретаторов ком. строки unix-shell и windows-cmd )
...
Рейтинг: 0 / 0
19.06.2014, 19:48
    #38674751
Kushtym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PERL анализ тектового файла
volodin661, благодарю за еще один вариант - это больше похоже на то что я видел/правил, я так и писал выше, что руки из задницы (мои руки, мои), работоспособность скриптов под сомнение не ставилось :)
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PERL анализ тектового файла / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]