powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PERL анализ тектового файла
13 сообщений из 13, страница 1 из 1
PERL анализ тектового файла
    #38672325
Kushtym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ув. коллеги, стоит задача анализировать текстовый лог файл с помощью 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
PERL анализ тектового файла
    #38672328
Kushtym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите, речь шла про блок номер 12, но в общем это не принципиально, ключевой момент, что анализировать один блок, все строки и после только новые с последующим уведомлением
...
Рейтинг: 0 / 0
PERL анализ тектового файла
    #38672466
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, подобный анализ однострочником на awk можно реализовать. Вроде не слишком сложно.
Еще не понятно, как скрипт должен узнать, на которой строке он остановился в прошлый раз - где-то в отдельном файле хранит номер последней проверенной строки, или между запусками скрипта в файл добавляется строго определенное к-во строк (тогда можно читать/проверять только последние N+1 строк), что-то другое? Что делать, если в проверяемых строках будет не одно, а несколько изменений? Что делать, если файл очищен (в файле меньше строк, чем было в прошлый визит)?
...
Рейтинг: 0 / 0
PERL анализ тектового файла
    #38673443
Kushtym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle,

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

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

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

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

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

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

Kushtymне будет ли никаких проблем, при одновременном запуске 10 таких скриптов, но нацеленных на разные логи?Не должно быть, если только не потребуется одновременный доступ на запись к какому то одному файлу. Впрочем, это тоже отчасти решаемо.
...
Рейтинг: 0 / 0
PERL анализ тектового файла
    #38674565
Kushtym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ув. 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
PERL анализ тектового файла
    #38674590
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kushtymя вот про эти файлы темповые ("свои файлы") спрашивалЭтот файл я бы не назвал временным. Он же содержит информацию для следующего запуска скрипта. Вполне такой рабочий и нужный файл.

Kushtymскрипт должен парсить каждые 10 минут один лог в течении одних сутокОтметки времени в логе не предусмотрены? Если метки есть, то можно на них ориентирваться. Конечно, при таком варианте появляется опасность пропустить что-то в случае, когда запуск скрипта не удался по какой-то причине.
...
Рейтинг: 0 / 0
PERL анализ тектового файла
    #38674743
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
PERL анализ тектового файла
    #38674749
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kushtym я просто пытаюсь запустить скрипт (про одну строку - это было образное выражение), действуя по инструкии господина volodin661 я пока получю болт


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


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