The OpenNET Project / Index page

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

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

"regexp - на совпадение в несколькох строках"  
Сообщение от resu email(??) on 01-Фев-06, 16:04 
в LOG-файле есть строки содержащие образец:

<date>.... spamd .... result Y .. <xxxxxxx> .... <yyyyy>

а за несколько строк до такой строки (число строк не постоянное) есть строка с образцом:

<date> ... smtpd ... from=<from_address> ...  to=<to_address> ...

вот я и хочу сделать из них строку на подобе:

Spam: <from_address> <to_address> <xxxxxx> <yyyy>

PS: надо для репорта себе мо мылу
PS: число строк с образцом 2 естественно много больше числа строк с образцом строк 1, (поетому на мой взгляд их надо искать только, если найден образец 1).
я пологаю, что ето все  можно сделать одним  REGEXP (писать цикл наверное не по перловски)

спасибо за помощь

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

 Оглавление

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


1. "regexp - на совпадение в несколькох строках"  
Сообщение от idle (ok) on 01-Фев-06, 23:09 
>в LOG-файле есть строки содержащие образец:
>
><date>.... spamd .... result Y .. <xxxxxxx> .... <yyyyy>
>
>а за несколько строк до такой строки (число строк не постоянное) есть
>строка с образцом:
>
><date> ... smtpd ... from=<from_address> ...  to=<to_address> ...
>
>вот я и хочу сделать из них строку на подобе:
>
>Spam: <from_address> <to_address> <xxxxxx> <yyyy>
>
>PS: надо для репорта себе мо мылу
>PS: число строк с образцом 2 естественно много больше числа строк с
>образцом строк 1, (поетому на мой взгляд их надо искать только,
>если найден образец 1).
>я пологаю, что ето все  можно сделать одним  REGEXP (писать
>цикл наверное не по перловски)
>
>спасибо за помощь
То есть, если я правильно понял, нужно чтобы regexp проверял не строку а всё что есть. Тогда так:
perldoc perlvar
undef $/;
$_ = <FH>;          # whole file now here

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

2. "regexp - на совпадение в несколькох строках"  
Сообщение от gr on 02-Фев-06, 01:56 
>в LOG-файле есть строки содержащие образец:
>
><date>.... spamd .... result Y .. <xxxxxxx> .... <yyyyy>
>
>а за несколько строк до такой строки (число строк не постоянное) есть
>строка с образцом:
>
><date> ... smtpd ... from=<from_address> ...  to=<to_address> ...
>
>вот я и хочу сделать из них строку на подобе:  я бы такой не взялся писать (с возвратами и прочими делами)
>
>Spam: <from_address> <to_address> <xxxxxx> <yyyy>
>
>PS: надо для репорта себе мо мылу
>PS: число строк с образцом 2 естественно много больше числа строк с
>образцом строк 1, (поетому на мой взгляд их надо искать только,
>если найден образец 1).
>я пологаю, что ето все  можно сделать одним  REGEXP (писать
>цикл наверное не по перловски)
>
>спасибо за помощь

Есть хоть 1 общий элемент в строках 1 и 2? если нет - регексп не поможет.

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

3. "regexp - на совпадение в несколькох строках"  
Сообщение от resu email(??) on 02-Фев-06, 13:12 
>Есть хоть 1 общий элемент в строках 1 и 2? если нет
>- регексп не поможет.

да, есть.
message-id остается уникален на всем пути обработки мыла.
значит надо искать от BOF  к EOF  и как только найдена строка с:

<date>.... spamd .... result Y ... <xxxxxxx> .. mid=<message_id> .. <yyyyy>

надо искать в обратном направлении (т.е.: от текущей стоки к BOF) строку с:

<date> ... queue_id: message-id=<message_id>

ну и теперь надо всего лиш из строк содержащих "queue_id:" вынуть все, что следует за етим "queue_id:" (до конца строки).

извините, что изменил формулировку задачи, но вы сами натолкнули меня на ету мысль.

ну и теперь снова тот же вопрос: можно ли все ето сделать одним REGEXP?
(лично я вижу только многократный проход по файлу :((. )

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

4. "regexp - на совпадение в несколькох строках"  
Сообщение от vt (ok) on 02-Фев-06, 16:11 
>ну и теперь снова тот же вопрос: можно ли все ето сделать
>одним REGEXP?
>(лично я вижу только многократный проход по файлу :((. )

Такие задачи решаются за один проход примерно так:
все <from_address>, <to_address>, <xxxxxx> и <yyyy>
помещаются в ассоциативный массив(ы)
(в perl это hash) по <message_id>,
и когда встретится строка с "result Y"
останется только взять из нее <message_id>
и получить по этому <message_id>
уже готовые значения <from_address>, <to_address> и т.д.

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

5. "regexp - на совпадение в несколькох строках"  
Сообщение от resu email(??) on 02-Фев-06, 18:51 
>>ну и теперь снова тот же вопрос: можно ли все ето сделать
>>одним REGEXP?
>>(лично я вижу только многократный проход по файлу :((. )
>
>Такие задачи решаются за один проход примерно так:
>все <from_address>, <to_address>, <xxxxxx> и <yyyy>
>помещаются в ассоциативный массив(ы)
>(в perl это hash) по <message_id>,
>и когда встретится строка с "result Y"
>останется только взять из нее <message_id>
>и получить по этому <message_id>
>уже готовые значения <from_address>, <to_address> и т.д.

т.е. вы предлагаете пройтись по файлу и скинуть в queue_id_hash все:
<massage_id>, <from_address>, <to_address>, <xxxxxx> и <yyyy>

и в spam_id_hash все:
<xxxxxxx> , mid=<message_id> , <yyyyy>
для которых  выполнилось условие "result: Y"
(т.е. первый проход: - несколько REGEXP’ов )

а затем, пройтись по queue_id_hash  и достать из него все поля с совпадающими message_id , т.е.:
     select * from queue_id_hash where message_id in (select mid from spam_id_hash)
(так короче и понятнее)
(т.е. второй проход:  цикл foreach( spam_id_hash ))

это конечно хорошо, а нельзя ли все это как то одним (пусть даже в три этажа) REGEXP’ом. т.е. наверное так и придется сделать, но все таки ведь это perl и может тут мона как то круче завернуть?

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

6. "regexp - на совпадение в несколькох строках"  
Сообщение от vt (ok) on 03-Фев-06, 08:36 
>(т.е. второй проход:  цикл foreach( spam_id_hash ))
Нет, всё делается за один проход - никаких foreach.
Приведите фрагмент реального лога
(а то в одном посте пишете об одних полях, в другом - уже о других),
тогда можно будет привести пример скрипта.

>это конечно хорошо, а нельзя ли все это как то одним (пусть
>даже в три этажа) REGEXP’ом. т.е. наверное так и придется сделать,
>но все таки ведь это perl и может тут мона как
>то круче завернуть?
ИМХО - в данном случае это невозможно,
а perl для этой задачи - не лучший выбор.


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

7. "regexp - на совпадение в несколькох строках"  
Сообщение от idle (ok) on 03-Фев-06, 14:27 

>а perl для этой задачи - не лучший выбор.
Для обработки текста(данный случай), лучший.

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

8. "regexp - на совпадение в несколькох строках"  
Сообщение от resu email(??) on 03-Фев-06, 16:46 
>>(т.е. второй проход:  цикл foreach( spam_id_hash ))
>Нет, всё делается за один проход - никаких foreach.
>Приведите фрагмент реального лога
тут постить много. если у вас нет под рукой лога от  Postfix + Spamassassin - тогда зашлю.

>(а то в одном посте пишете об одних полях, в другом -
>уже о других),
а это потому, что я сначала думал брать инфу из одной строки, а потом, после идеи  связать mail’ы  по их message_id (у Spamassasin - mid) - проскачившей от вас и "gr" - решил брать эту же инфу из разных строк с общим message_id.
хочу добавить, что  это, неверное, единственно правильное решение - спасибо!

>тогда можно будет привести пример скрипта.
а вот это было бы - супер!!

>а perl для этой задачи - не лучший выбор.
так я  PERL  именно по тому и выбрал, что думал как "idle".
в perl'e - я плохо рублю и с радостью перейду на что-то другое, но что может  лучще его справиться с такой задачей?
что вы порекомендуете?

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

9. "regexp - на совпадение в несколькох строках"  
Сообщение от vt (ok) on 06-Фев-06, 09:47 
>что вы порекомендуете?
gawk

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

10. "regexp - на совпадение в несколькох строках"  
Сообщение от resu email(??) on 06-Фев-06, 18:04 
>>что вы порекомендуете?
>gawk

я пока прикинул код (сделал наброски) на awk (если делать по описанному выше алгоритму).

в awk надо определять позиции искомых констант (index()/substr() - вырезать значение message_id) ,
в то время как в перле (я пологаю) можно сделать нечто вроде:
/..(..).(..)../..(1)..(2)../
(есть переменная $чегото-там, которая хранит то, что в скобках)

в awk - подобного инструмента - я незнaю и пологал, что код не перл будет меньше / проще.

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

11. "regexp - на совпадение в несколькох строках"  
Сообщение от vt (ok) on 07-Фев-06, 15:38 
>в awk - подобного инструмента - я незнaю и пологал, что код
>не перл будет меньше / проще.
Теоретизировать не хочется, sorry
Могу только ещё раз повторить - приведите фрагменты лога,
тогда можно будет и скрипто-байты посчитать )
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

12. "regexp - на совпадение в несколькох строках"  
Сообщение от resu email(??) on 07-Фев-06, 17:42 
>>в awk - подобного инструмента - я незнaю и пологал, что код
>>не перл будет меньше / проще.
>Теоретизировать не хочется, sorry
>Могу только ещё раз повторить - приведите фрагменты лога,
>тогда можно будет и скрипто-байты посчитать )

ну, раз вы настаиваете, вот лог, а про скриптобайты это круто загнули.

по сути: мыло приходит к постфиксу, от него к ассассину (тот определяет спам это или нет и кидает письмо обратно постфиксу), затем проверяется на вирусы и снова через постфикс идет к внутреннему серверу, с которого юзверы и берут свою почту.
оба письма спамные (хотя ассассин второе не опоснал как спам, но ведь нам как раз эти 2 варианта и нужны: т.е. спам (1) и не_спам(2))


Feb  7 14:01:50 pf postfix/smtpd[15782]: connect from ppp83-237-107-71.pppoe.mtu-net.ru[83.237.107.71]
Feb  7 14:01:54 pf postfix/smtpd[15782]: 4840569C3A: client=ppp83-237-107-71.pppoe.mtu-net.ru[83.237.107.71]
Feb  7 14:01:54 pf postfix/cleanup[15854]: 4840569C3A: message-id=<9323481215.83283283230136@0451.com>
Feb  7 14:01:55 pf postfix/qmgr[32282]: 4840569C3A: from=<czqiji@0451.com>, size=2927, nrcpt=1 (queue active)
Feb  7 14:01:55 pf spamd[24045]: connection from localhost [127.0.0.1] at port 47126
Feb  7 14:01:55 pf spamd[24045]: processing message <9323481215.83283283230136@0451.com> for nobody:65534.
Feb  7 14:01:55 pf spamd[24045]: identified spam (10.1/8.0) for nobody:65534 in 0.2 seconds, 2861 bytes.
Feb  7 14:01:55 pf spamd[24045]: result: Y 10 - BAYES_99,DATE_IN_PAST_06_12,DRUGS_ERECTILE,DRUG_DOSAGE,HTML_FONT_BIG,HTML_FONT_SIZE_LARGE,HTML_MESSAGE,HTML_SHOUTING5,ONLINE_PHARMACY,UPPERCASE_25_50 scantime=0.2,size=2861,mid=<9323481215.83283283230136@0451.com>,bayes=1,autolearn=disabled
Feb  7 14:01:56 pf postfix/smtpd[15782]: disconnect from ppp83-237-107-71.pppoe.mtu-net.ru[83.237.107.71]
Feb  7 14:01:56 pf postfix/pickup[8215]: 1C6BB69C50: uid=65534 from=<czqiji@0451.com>
Feb  7 14:01:56 pf postfix/cleanup[15854]: 1C6BB69C50: message-id=<9323481215.83283283230136@0451.com>
Feb  7 14:01:56 pf postfix/pipe[15866]: 4840569C3A: to=<a1aaa1azzzz1zaaaaa@mydomain.com>, relay=spamassassin, delay=2, status=sent (pf.mydomain.com)
Feb  7 14:01:56 pf postfix/qmgr[32282]: 4840569C3A: removed
Feb  7 14:01:56 pf postfix/qmgr[32282]: 1C6BB69C50: from=<czqiji@0451.com>, size=6157, nrcpt=1 (queue active)
Feb  7 14:01:56 pf clamsmtpd: 1004F3: accepted connection from: 127.0.0.1
Feb  7 14:01:56 pf postfix/smtpd[15922]: connect from localhost[127.0.0.1]
Feb  7 14:01:56 pf postfix/smtpd[15922]: F2BBC69C56: client=localhost[127.0.0.1]
Feb  7 14:01:57 pf clamd[27574]: SelfCheck: Database status OK.
Feb  7 14:01:57 pf clamd[27574]: /tmp/clamsmtpd.BiDLTd: OK
Feb  7 14:01:57 pf postfix/cleanup[15854]: F2BBC69C56: message-id=<9323481215.83283283230136@0451.com>
Feb  7 14:01:57 pf clamsmtpd: 1004F3: from=czqiji@0451.com, to=a1aaa1azzzz1zaaaaa@mydomain.com, status=CLEAN
Feb  7 14:01:57 pf postfix/smtp[15920]: 1C6BB69C50: to=<a1aaa1azzzz1zaaaaa@mydomain.com>, relay=127.0.0.1[127.0.0.1], delay=2, status=sent (250 Ok: queued as F2BBC69C56)
Feb  7 14:01:57 pf postfix/qmgr[32282]: F2BBC69C56: from=<czqiji@0451.com>, size=6414, nrcpt=1 (queue active)
Feb  7 14:01:57 pf postfix/qmgr[32282]: 1C6BB69C50: removed
Feb  7 14:01:57 pf postfix/smtpd[15922]: disconnect from localhost[127.0.0.1]
Feb  7 14:02:02 pf postfix/smtp[15936]: F2BBC69C56: to=<a1aaa1azzzz1zaaaaa@mydomain.com>, relay=192.168.0.14[192.168.0.14], delay=6, status=sent (250 Message accepted for delivery)
Feb  7 14:02:02 pf postfix/qmgr[32282]: F2BBC69C56: removed

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Feb  7 14:19:01 pf postfix/smtpd[20723]: connect from 219-86-97-135.dynamic.tfn.net.tw[219.86.97.135]
Feb  7 14:19:05 pf postfix/smtpd[20723]: 434EF68E4F: client=219-86-97-135.dynamic.tfn.net.tw[219.86.97.135]
Feb  7 14:19:09 pf postfix/cleanup[20824]: 434EF68E4F: message-id=<124439.2741586399343.213473685133.HXKU.4666@sportcenter.com>
Feb  7 14:19:14 pf postfix/qmgr[32282]: 434EF68E4F: from=<Maria.Dean@floridaroof.com>, size=19556, nrcpt=3 (queue active)
Feb  7 14:19:14 pf spamd[25440]: connection from localhost [127.0.0.1] at port 55382
Feb  7 14:19:14 pf spamd[25440]: processing message <124439.2741586399343.213473685133.HXKU.4666@sportcenter.com> for nobody:65534.
Feb  7 14:19:14 pf spamd[25440]: clean message (7.0/8.0) for nobody:65534 in 0.1 seconds, 19230 bytes.
Feb  7 14:19:14 pf spamd[25440]: result: .  7 - BAYES_99,HTML_80_90,HTML_IMAGE_ONLY_24,HTML_MESSAGE scantime=0.1,size=19230,mid=<124439.2741586399343.213473685133.HXKU.4666@sportcenter.com>,bayes=0.999999999999892,autolearn=disabled
Feb  7 14:19:14 pf postfix/pickup[8215]: 7335368E51: uid=65534 from=<Maria.Dean@floridaroof.com>
Feb  7 14:19:14 pf postfix/pipe[20831]: 434EF68E4F: to=<tku@mydomain.com>, relay=spamassassin, delay=11, status=sent (pf.mydomain.com)
Feb  7 14:19:14 pf postfix/pipe[20831]: 434EF68E4F: to=<wqd@mydomain.com>, relay=spamassassin, delay=11, status=sent (pf.mydomain.com)
Feb  7 14:19:14 pf postfix/pipe[20831]: 434EF68E4F: to=<sde@mydomain.com>, relay=spamassassin, delay=11, status=sent (pf.mydomain.com)
Feb  7 14:19:14 pf postfix/qmgr[32282]: 434EF68E4F: removed
Feb  7 14:19:14 pf postfix/cleanup[20824]: 7335368E51: message-id=<124439.2741586399343.213473685133.HXKU.4666@sportcenter.com>
Feb  7 14:19:14 pf postfix/qmgr[32282]: 7335368E51: from=<Maria.Dean@floridaroof.com>, size=19929, nrcpt=3 (queue active)
Feb  7 14:19:14 pf clamsmtpd: 1004F6: accepted connection from: 127.0.0.1
Feb  7 14:19:14 pf postfix/smtpd[20837]: connect from localhost[127.0.0.1]
Feb  7 14:19:14 pf postfix/smtpd[20837]: C63BD68E4F: client=localhost[127.0.0.1]
Feb  7 14:19:14 pf postfix/smtpd[20723]: disconnect from 219-86-97-135.dynamic.tfn.net.tw[219.86.97.135]
Feb  7 14:19:15 pf clamd[27574]: SelfCheck: Database status OK.
Feb  7 14:19:15 pf clamd[27574]: /tmp/clamsmtpd.bdwtQr: OK
Feb  7 14:19:15 pf postfix/cleanup[20824]: C63BD68E4F: message-id=<124439.2741586399343.213473685133.HXKU.4666@sportcenter.com>
Feb  7 14:19:15 pf postfix/qmgr[32282]: C63BD68E4F: from=<Maria.Dean@floridaroof.com>, size=20145, nrcpt=3 (queue active)
Feb  7 14:19:15 pf clamsmtpd: 1004F6: from=Maria.Dean@floridaroof.com, to=tku@mydomain.com, to=wqd@mydomain.com, to=sde@mydomain.com, status=CLEAN
Feb  7 14:19:15 pf postfix/smtp[20835]: 7335368E51: to=<tku@mydomain.com>, relay=127.0.0.1[127.0.0.1], delay=1, status=sent (250 Ok: queued as C63BD68E4F)
Feb  7 14:19:15 pf postfix/smtp[20835]: 7335368E51: to=<wqd@mydomain.com>, relay=127.0.0.1[127.0.0.1], delay=1, status=sent (250 Ok: queued as C63BD68E4F)
Feb  7 14:19:15 pf postfix/smtp[20835]: 7335368E51: to=<sde@mydomain.com>, relay=127.0.0.1[127.0.0.1], delay=1, status=sent (250 Ok: queued as C63BD68E4F)
Feb  7 14:19:15 pf postfix/qmgr[32282]: 7335368E51: removed
Feb  7 14:19:15 pf postfix/smtpd[20837]: disconnect from localhost[127.0.0.1]
Feb  7 14:19:20 pf postfix/smtp[20841]: C63BD68E4F: to=<tku@mydomain.com>, relay=192.168.0.14[192.168.0.14], delay=6, status=sent (250 Message accepted for delivery)
Feb  7 14:19:20 pf postfix/smtp[20841]: C63BD68E4F: to=<wqd@mydomain.com>, relay=192.168.0.14[192.168.0.14], delay=6, status=sent (250 Message accepted for delivery)
Feb  7 14:19:20 pf postfix/smtp[20841]: C63BD68E4F: to=<sde@mydomain.com>, relay=192.168.0.14[192.168.0.14], delay=6, status=sent (250 Message accepted for delivery)
Feb  7 14:19:20 pf postfix/qmgr[32282]: C63BD68E4F: removed

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

13. "regexp - на совпадение в несколькох строках"  
Сообщение от vt (ok) on 09-Фев-06, 10:33 
>ну, раз вы настаиваете, вот лог
ОК
Что видим: интересующая нас информация - это последовательность
... <N> message-id=<mid> ...
... <N> from=<from> ...
...
... result: Y ... mid=<mid> ...
...
... <N> to=<to> ...

Общий случай - если последовательности, относящиеся к разным письмам, перемешаны, т.е. между строчками относящимися к одному письму
могут появляться строчки, относящиеся к другому письму
#!/bin/awk -f
$7~/from=/ {f[$6]=$7}
$7~/message-id=/ {split($7,a,"="); m[$6]=a[2]}
/result: Y/ {sub(/.*mid=/,""); sub(/,.*/,""); r[$0]++}
$7~/to=/ && r[m[$6]] {r[m[$6]]=0; print f[$6],$7}

Частный случай - если последовательности не перемешаны
(как в приведенном логе)
#!/bin/awk -f
$7~/from=/{f=$7}/result: Y/{r=1}$7~/to=/&&r{r=0;print f,$7}

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

14. "regexp - на совпадение в несколькох строках"  
Сообщение от resu email(??) on 10-Фев-06, 14:27 
>Общий случай - если последовательности, относящиеся к разным письмам, перемешаны, т.е. между
>строчками относящимися к одному письму
>могут появляться строчки, относящиеся к другому письму
>#!/bin/awk -f
>$7~/from=/ {f[$6]=$7}
>$7~/message-id=/ {split($7,a,"="); m[$6]=a[2]}
>/result: Y/ {sub(/.*mid=/,""); sub(/,.*/,""); r[$0]++}
>$7~/to=/ && r[m[$6]] {r[m[$6]]=0; print f[$6],$7}
>

Да, похоже на то!!!
огромное спасибо. снимаю шляпу! все что я знал про awk можно забыть и начать учить заново. Тепрь осталось толко разобраться в вашем коде.

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

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

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




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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