фильтрация текста :( (надеюсь кто-нибудь поможет)

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

knicefire
Сообщения: 86
ОС: Arch Linux

фильтрация текста :(

Сообщение knicefire »

Привет всем.

Я собираю трапы с кое-каких железок. Мне приходят трапы но их форматирование не приносит хороших результатов так как отображается очень много излишней информации. Используется демон snmptrapd c параметрами -Lo -t -f -F "Trap.%v from %B\n"
Насколько я понял из манов параметр %v дает список переменных пересылаемых в сообщении, а параметр %B - имя или адрес компьютера отославшего трап. Список переменных получается довольно большим из этого всего мне необходимо выбрать только те которые находятся в кавычках.
Т.е. я получаю строки вида

2008-09-03 15:36:14 TRAP.SNMPv2-SMI::enterprises.12394.1.2.6.4.0 2165617 SNMPv2-SMI::enterprises.12394.1.2.6.6.0 "NPU.Slot#5" SNMPv2-SMI::enterprises.12394.1.2.6.5.0 2 SNMPv2-SMI::enterprises.12394.1.2.6.8.0 2 SNMPv2-SMI::enterprises.12394.1.2.100.3.1.1.1.0 526 SNMPv2-SMI::enterprises.12394.1.2.100.7.1.1.1.0 353 SNMPv2-SMI::enterprises.12394.1.2.100.3.1.1.3.0 "evidens3_BS487_BE256" SNMPv2-SMI::enterprises.12394.1.2.100.7.1.1.2.0 "1505" from 192.168.50.141

2008-09-03 15:36:14 TRAP.SNMPv2-SMI::enterprises.12394.1.2.6.4.0 2165618 SNMPv2-SMI::enterprises.12394.1.2.6.6.0 "SU.00-10-e7-62-af-1c" SNMPv2-SMI::enterprises.12394.1.2.6.5.0 5 SNMPv2-SMI::enterprises.12394.1.2.6.8.0 1 SNMPv2-SMI::enterprises.12394.1.2.6.7.0 131 from 192.168.50.141

Из всего этого "добра" мне необходимо только то что находится в кавычках. Т.е. хотелось бы привести строки в такой вид.

2008-09-03 15:36:14 TRAP.NPU.Slot#5 evidens3_BS487_BE256 1505 from 192.168.50.141

2008-09-03 15:36:14 TRAP. SU.00-10-e7-62-af-1c from 192.168.50.141


Понимаю что стандартными методами правки конфига snmptrapd или изменением параметров после флага -F этого не добиться, поэтому есть идея использовать че-то типа awk-sed. Только пока что у меня это совсем не получается.. помогите плз..


P.S. Прощу прощения за столь длинную предысторию, но возможно есть и другие решения помимо того пути который выбрал я.
Заранее спасибо ответившим.
Спасибо сказали:
Аватара пользователя
csx
Сообщения: 302
Статус: Сыч Домовый
ОС: Что сломалось, то и чиним...

Re: фильтрация текста :(

Сообщение csx »

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

Сорри за страшные регэкспы, можно, в принципе, сделать проще.

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

$txt = $ARGV[0];
if ($txt) {} else {die "no 1st arg in command line";};

open F, $txt;

    while (<F>) {
        $line = $_;
        $line =~ /(\d{4}(-\d{2}){2}\s(\d{2}:){2}\d{2})\s/smi;
    $date = $1;
    $line =~ /(\sfrom\s(\d{1,3}\.){3}\d{1,3})/smi;
    $from = $1;
    print $date;
    $quotes = $line;
    while ($quotes =~ /\s\"(.*?)\"\s/smig) {
            print " ".$1;
    };
    print $from."\n";
    };

close F;
-- Как называется болезнь когда всё время по телефону разговариваешь?
-- Техподдержка...
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: фильтрация текста :(

Сообщение allez »

Способ быстрый и грязный, но вроде работает :-)

allez@home:~/tmp> cat file 2008-09-03 15:36:14 TRAP.SNMPv2-SMI::enterprises.12394.1.2.6.4.0 2165617 SNMPv2-SMI::enterprises. 12394.1.2.6.6.0 "NPU.Slot#5" SNMPv2-SMI::enterprises.12394.1.2.6.5.0 2 SNMPv2-SMI::enterprises. 12394.1.2.6.8.0 2 SNMPv2-SMI::enterprises.12394.1.2.100.3.1.1.1.0 526 SNMPv2-SMI::enterprises. 12394.1.2.100.7.1.1.1.0 353 SNMPv2-SMI::enterprises.12394.1.2.100.3.1.1.3.0 "evidens3_BS487_BE256" SNMPv2-SMI::enterprises.12394.1.2.100.7.1.1.2.0 "1505" from 192.168.50.141 2008-09-03 15:36:14 TRAP.SNMPv2-SMI::enterprises.12394.1.2.6.4.0 2165618 SNMPv2-SMI::enterprises. 12394.1.2.6.6.0 "SU.00-10-e7-62-af-1c" SNMPv2-SMI::enterprises.12394.1.2.6.5.0 5 SNMPv2-SMI::enterprises. 12394.1.2.6.8.0 1 SNMPv2-SMI::enterprises.12394.1.2.6.7.0 131 from 192.168.50.141 allez@home:~/tmp> cat file | while read LINE; do BEGINNING=$(echo $LINE | grep -o ".*TRAP."); MIDDLE= $(echo $LINE | grep -o "\"[^\"]*\"" | sed 's/"//g' | tr "\n" " "); ENDING=$(echo $LINE | grep -o "from.*"); echo "${BEGINNING}${MIDDLE}${ENDING}"; done 2008-09-03 15:36:14 TRAP.NPU.Slot#5 evidens3_BS487_BE256 1505 from 192.168.50.141 2008-09-03 15:36:14 TRAP.SU.00-10-e7-62-af-1c from 192.168.50.141
Спасибо сказали:
Аватара пользователя
csx
Сообщения: 302
Статус: Сыч Домовый
ОС: Что сломалось, то и чиним...

Re: фильтрация текста :(

Сообщение csx »

2allez

Если в середине строчки встретится from то будет плохо :)
-- Как называется болезнь когда всё время по телефону разговариваешь?
-- Техподдержка...
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: фильтрация текста :(

Сообщение allez »

Если встретится, то таки да, будет.
Спасибо сказали:
knicefire
Сообщения: 86
ОС: Arch Linux

Re: фильтрация текста :(

Сообщение knicefire »

allez писал(а):
03.09.2008 19:51
Если встретится, то таки да, будет.

Спасибо огромное!

from не попадется в средине строки т.к. это слово формируется в результате работы сортировки snmptrapd :)
это слово будет в конце и после него будет следовать айпи с которого отправлен трап

спасибо большое.. файл это конечно хорошо.. но snmptrapd у меня работает выводя трапы на стандартный поток вывода.. и надо этот поток отфильтровывать.. в любом случае спасибо за наводку.. попробую применить это к моей конкретной задаче!!!




СПАСИБО!!!!!!!! :drinks:
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: фильтрация текста :(

Сообщение allez »

knicefire писал(а):
03.09.2008 21:44
файл это конечно хорошо.. но snmptrapd у меня работает выводя трапы на стандартный поток вывода.. и надо этот поток отфильтровывать..
Ну так у меня цикл while как раз и обрабатывает стандартный поток вывода команды cat. Замените cat на вашу команду и все у вас получится. ;)
Спасибо сказали:
Аватара пользователя
csx
Сообщения: 302
Статус: Сыч Домовый
ОС: Что сломалось, то и чиним...

Re: фильтрация текста :(

Сообщение csx »

Равно как мой скрипт можно переделать, там <STDIN> кажется надо подставить вместо файла.... Перл-гуру щас придут подскажут, если есть.

Но метод allez'а по производительности, скорее всего, будет лучше.
-- Как называется болезнь когда всё время по телефону разговариваешь?
-- Техподдержка...
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: фильтрация текста :(

Сообщение Portnov »

csx, тупо while (<>).
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали: