Элементарный список OID, но как? (Составление Zabbix шаблона)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
ReSeR
Сообщения: 383
ОС: GNU Debian

Элементарный список OID, но как?

Сообщение ReSeR »

Есть у меня задача составить шаблон "Zabbix" для Cisco Catalyst 6500, все бы ничего, только портов у него много, а в шаблон данные почти все нужно руками прописывать.
Вот собственно и сама заготовка шаблона:

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

<item type=4 key=portOutOctets$n value_type=3>
          <description>portOutOctets$n</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>60</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>b</units>
          <multiplier>1</multiplier>
          <delta>1</delta>
          <formula>8</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts></trapper_hosts>
          <snmp_community>public</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.31.1.1.1.10. $oid </snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <valuemapid>0</valuemapid>
          <applications/>
        </item>

Может кто-то знает как сделать так, чтобы $n и $oid увеличивались на единицу. Но $n - начиная с "1", а $oid - начиная с "79"?
Я пробовал использовать цикл for, но не знаю как ему прописать два значения одновременно. Что-то типа:

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

#!/bin/bash
for oid in 79 80 81..212
for n in 1 2 3...133
do
---------
done
Бэкап - акт проявления трусости.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Элементарный список OID, но как?

Сообщение drBatty »

ReSeR писал(а):
26.05.2011 11:04
Может кто-то знает как сделать так, чтобы $n и $oid увеличивались на единицу. Но $n - начиная с "1", а $oid - начиная с "79"?
Я пробовал использовать цикл for, но не знаю как ему прописать два значения одновременно. Что-то типа:

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

#!/bin/bash

oid=79
for n in {1..133}
do
    echo "$n $oid"
    (( oid++ ))
done


ReSeR писал(а):
26.05.2011 11:04
Бэкап - акт проявления трусости.

http://lurkmore.ru/An_Hero
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ReSeR
Сообщения: 383
ОС: GNU Debian

Re: Элементарный список OID, но как?

Сообщение ReSeR »

Спасибо Вам большое, сработало!
Бэкап - акт проявления трусости.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Элементарный список OID, но как?

Сообщение drBatty »

работает, но лучше вместо
for n in {1..133}
написать

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

for (( n = 1; n <= 133; n++ ))
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Элементарный список OID, но как?

Сообщение Subj »

drBatty писал(а):
26.05.2011 14:07
работает, но лучше вместо
for n in {1..133}
написать

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

for (( n = 1; n <= 133; n++ ))


Почему? :huh:
Я вообще использую seq для подобного ))
Building better software with Ada
Спасибо сказали:
Аватара пользователя
ReSeR
Сообщения: 383
ОС: GNU Debian

Re: Элементарный список OID, но как?

Сообщение ReSeR »

Ну лично в моём случае, работает только способ

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

#!/bin/bash

oid=79
for n in {1..133}
do
    echo "$n $oid"
    (( oid++ ))
done

Т.к. нумерация portOutOctets$n в шаблоне идёт по порядку, а вот OID-ы (сволочи) идут с шагом 2 или 3. И приходится для for использовать ввод с файла

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

for oid in `cat FILE`
Бэкап - акт проявления трусости.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Элементарный список OID, но как?

Сообщение drBatty »

Subj писал(а):
26.05.2011 15:58
Почему?

потому, что строчка {1..1000000} расползётся на много мегабайт. Хотя... bash сам по себе тормозной, а много мегабайт - копейки.
ReSeR писал(а):
26.05.2011 16:20
а вот OID-ы (сволочи) идут с шагом 2 или 3

hint
$ echo {7..30..3}
7 10 13 16 19 22 25 28


Subj писал(а):
26.05.2011 15:58
Я вообще использую seq для подобного ))

seq тоже хорош. ибо и for (( )), и {..} это башизмы, и AFAIK в других шелах не сработают. Но у нас в первом посте по условию bash.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Элементарный список OID, но как?

Сообщение t.t »

drBatty писал(а):
26.05.2011 11:25
ReSeR писал(а):
26.05.2011 11:04
Может кто-то знает как сделать так, чтобы $n и $oid увеличивались на единицу. Но $n - начиная с "1", а $oid - начиная с "79"?
Я пробовал использовать цикл for, но не знаю как ему прописать два значения одновременно. Что-то типа:

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

#!/bin/bash

oid=79
for n in {1..133}
do
    echo "$n $oid"
    (( oid++ ))
done

На мой взгляд, слишком сложно.

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

#!/bin/bash
for i in $(seq 133); do
    echo $i $(($i+78))
done
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
ReSeR
Сообщения: 383
ОС: GNU Debian

Re: Элементарный список OID, но как?

Сообщение ReSeR »

t.t писал(а):
26.05.2011 22:39
На мой взгляд, слишком сложно.

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

#!/bin/bash
for i in $(seq 133); do
    echo $i $(($i+78))
done

Эм, ну как бы эт не совсем то.
После

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

#!/bin/bash
n=1
for oid in `cat ~/oids`
do
echo "<item type=\"4\" key=\"portOutOctets$n\" value_type=\"3\">
          <description>portOutOctets$n</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>60</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>bps</units>
          <multiplier>1</multiplier>
          <delta>1</delta>
          <formula>8</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts></trapper_hosts>
          <snmp_community>public</snmp_community>
          <snmp_oid>iso.3.6.1.2.1.2.2.1.16.$oid</snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <valuemapid>0</valuemapid>
          <applications/>
        </item>
"
((n++))
done
exit 0
я получил "правильный" файл.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Бэкап - акт проявления трусости.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Элементарный список OID, но как?

Сообщение drBatty »

ReSeR писал(а):
27.05.2011 10:41
Эм, ну как бы эт не совсем то.

можно было-бы и так сделать. В такой простой задаче сложно сказать что "проще". Не сомневаюсь, что t.t с лёгкостью-бы сделал по своему. ИМХО мне показался этот путь самым простым для понимания, и для модификации.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Элементарный список OID, но как?

Сообщение drBatty »

да, мне задачи такого плана попадаются довольно часто. Я их решаю так:
1) составляется шаблон. В данном случае такой

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

<item type=4 key=portOutOctets{N} value_type=3>
          <description>portOutOctets{N}</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>60</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>b</units>
          <multiplier>1</multiplier>
          <delta>1</delta>
          <formula>8</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts></trapper_hosts>
          <snmp_community>public</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.31.1.1.1.10. {OID} </snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <valuemapid>0</valuemapid>
          <applications/>
        </item>

2) тут нам нужно просто размножить один шаблон. А значит - цикл. {N} у нас естественно становится счётчиком цикла.

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

for (( N=1; N<=133; N++ ))
do
    (( OID++ )) # вот тут можно как t.t считать каждый раз, или как я - итеративно вычислять в каждой итерации. Не важно
    sed "s/{N}/$N/g; s/{OID}/$OID/g" template >>dest #добавляем модифицированный шаблон к общему файлу
done


Это удобно по двум причинам:
1) мы можем с лёгкостью изменить шаблон, и сгенерировать файл по новой.
2) мы легко можем добавить дополнительные параметры.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Элементарный список OID, но как?

Сообщение sgfault »

drBatty писал(а):
26.05.2011 14:07
работает, но лучше вместо
for n in {1..133}
написать

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

for (( n = 1; n <= 133; n++ ))


Правда ли лучше?

Попробуем такой скрипт

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

#!/bin/bash


time {
    for ((i= 1; i <= 1000000; ++i)); do
        echo "$i"
    done >/dev/null
}

time {
    for i in $(seq 1 1000000); do
        echo "$i"
    done >/dev/null
}


получится

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

[sgf@shilvana ~]$ ./t.sh

real    0m15.656s
user    0m14.415s
sys    0m1.218s

real    0m9.670s
user    0m9.131s
sys    0m0.609s
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Элементарный список OID, но как?

Сообщение ZyX »

sgfault писал(а):
02.06.2011 12:35
drBatty писал(а):
26.05.2011 14:07
работает, но лучше вместо
for n in {1..133}
написать

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

for (( n = 1; n <= 133; n++ ))


Правда ли лучше?

Попробуем такой скрипт

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

#!/bin/bash


time {
    for ((i= 1; i <= 1000000; ++i)); do
        echo "$i"
    done >/dev/null
}

time {
    for i in $(seq 1 1000000); do
        echo "$i"
    done >/dev/null
}


получится

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

[sgf@shilvana ~]$ ./t.sh

real    0m15.656s
user    0m14.415s
sys    0m1.218s

real    0m9.670s
user    0m9.131s
sys    0m0.609s


Для zsh всё более печально:

/tmp/zsh - 1 (Created by format.vim)

(zyx:~/tmp/zsh) % cat for-seq time ( for ((i= 1; i <= 1000000; ++i)); do echo "$i" done >/dev/null ) time ( for i in $(seq 1 1000000); do echo "$i" done >/dev/null ) (zyx:~/tmp/zsh) % zsh for-seq ( for ((i= 1; i <= 1000000; ++i)) do; echo "$i"; done > /dev/null; ) 3,26s user 0,74s system 98% cpu 4,075 total ^C( for i in $(seq 1 1000000); do; echo "$i"; done > /dev/null; ) 280,09s user 21,13s system 97% cpu 5:07,94 total zsh for-seq 283,36s user 21,87s system 97% cpu 5:12,02 total (zyx:~/tmp/zsh) % bash for-seq real 0m11.971s user 0m11.627s sys 0m0.272s real 0m9.107s user 0m9.066s sys 0m0.186s bash for-seq 20,69s user 0,47s system 100% cpu 21,145 total (zyx:~/tmp/zsh) %


Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Элементарный список OID, но как?

Сообщение drBatty »

sgfault писал(а):
02.06.2011 12:35
Правда ли лучше?

Попробуем такой скрипт

пробуйте. Но мне как-бы не нравится, когда вместо обработки чисел 1, 2, 3, 4, и т.д. Я режу строчку "1 2 3 4 5 6 7 8 9 10 11 12..." на кусочки, разделённые пробелом, а потом эти кусочки интерпретирую как числа... ИМХО.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Элементарный список OID, но как?

Сообщение watashiwa_daredeska »

drBatty писал(а):
30.08.2011 01:28
мне как-бы не нравится, когда вместо обработки чисел 1, 2, 3, 4, и т.д. Я режу строчку "1 2 3 4 5 6 7 8 9 10 11 12..." на кусочки, разделённые пробелом, а потом эти кусочки интерпретирую как числа... ИМХО.
Оно всегда и везде так. Ничо, что сам скрипт сначала режется на кусочки (по гораздо более заумным правилам, нежели просто по пробелам), а потом эти кусочки разным образом интерпретируются? Да и любой текстовый файл, к сожалению, это длинная-длинная строка, которая режется на кусочки, а каждый кусочек интерпретируется уже как отдельная строка. Ужас-ужас :)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Элементарный список OID, но как?

Сообщение drBatty »

watashiwa_darede... писал(а):
30.08.2011 16:28
Оно всегда и везде так. Ничо, что сам скрипт сначала режется на кусочки

когда кусочков 10..100 - ничего.
когда их 100500 - чего...
ИМХО
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Элементарный список OID, но как?

Сообщение t.t »

drBatty, прочитайте полностью сообщение от 2-го июня, на которое Вы ответили: Ваш вариант медленнее.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Элементарный список OID, но как?

Сообщение ZyX »

t.t писал(а):
31.08.2011 22:23
drBatty, прочитайте полностью сообщение от 2-го июня, на которое Вы ответили: Ваш вариант медленнее.

Прочитайте также моё сообщение: его вариант в zsh быстрее. Лучше использовать именно его: будет меньше проблем, если захотите перейти.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Элементарный список OID, но как?

Сообщение drBatty »

t.t писал(а):
31.08.2011 22:23
прочитайте полностью сообщение от 2-го июня, на которое Вы ответили: Ваш вариант медленнее.

я знаю.
это проблема BASH'а. Просто он с любыми данными работает как со строками. Потому кривой путь получается быстрее прямого. Если-бы в BASH'е были-бы целые числа, мой вариант работал-бы быстрее...
ZyX да, я с вами согласен.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Элементарный список OID, но как?

Сообщение t.t »

ZyX писал(а):
31.08.2011 23:00
t.t писал(а):
31.08.2011 22:23
drBatty, прочитайте полностью сообщение от 2-го июня, на которое Вы ответили: Ваш вариант медленнее.

Прочитайте также моё сообщение: его вариант в zsh быстрее. Лучше использовать именно его: будет меньше проблем, если захотите перейти.

Не совсем понял, о каких проблемах и о каком переходе речь?

А насчёт того, что лучше... Почему в книгах по коммерческим Unix-ам уделяют столько внимания столь неудобному POSIX shell? Потому что в большинстве таких систем bash и zsh может не быть, а POSIX shell есть всегда. В точности то же самое можно сказать о bash и Linux: в любой Linux-системе bash установлен по умолчанию. Именно поэтому я не хочу переучиваться на zsh. На свою машину я могу поставить всё что угодно. Но мне элементарно удобно быть уверенным в том, что на _любой_ Linux-машине есть привычная мне оболочка.

А в данном конкретном случае есть ещё один (второстепенный) момент. На мой взгляд, вариант "for n in `seq 133`" гораздо легче и быстрее воспринимается "на глаз", чем "for ((n=1; n<=133; n++))". Запись seq 133 атомарна, а вторая запись состоит из трёх раздельных элементов, каждый из которых "читается" по отдельности. Понятно, что для опытного сишника, который уже давно набил руку на такие циклы, вторая запись тоже выглядит атомарной. Но лично мне первая нравится гораздо больше. В первом варианте заложена логика человеческая, а во втором -- компьютерная. Я не привык думать как компьютер.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Элементарный список OID, но как?

Сообщение sgfault »

ZyX писал(а):
31.08.2011 23:00
t.t писал(а):
31.08.2011 22:23
drBatty, прочитайте полностью сообщение от 2-го июня, на которое Вы ответили: Ваш вариант медленнее.

Прочитайте также моё сообщение: его вариант в zsh быстрее. Лучше использовать именно его: будет меньше проблем, если захотите перейти.

Могу сказать вам то же самое, только про перенос скрипта с bash на sh. Вариант drBatty просто не будет работать.
Спасибо сказали: