Ad Widget

Collapse

Сравнение двух Character

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Lurker
    Member
    • Nov 2016
    • 83

    #1

    Сравнение двух Character

    Добрый день.
    По snmp получаю 2 characrer итема. Т.е. по сути 2 строки.
    Вопрос: как написать тригер, который проверяет вхождение одной строки в другую?
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    В общем случае напрямую так сравнить нельзя, два значения разных айтемов можно сравнить лишь на равенство/неравенство.
    Но, скорее всего, задачу можно решить для каких-то частных случаев. Например, если вы знаете, в каком месте исходной строки или по какому разделителю нужно искать подстроку, то можно через предобработку извлекать нужную часть и сравнивать уже её.
    Ну и не забываем про указание версии Zabbix и про эффект, возникающий при сравнении в триггере значений двух элементов данных и описанный в FAQ.
    Last edited by Kos; 30-10-2023, 17:03.

    Comment

    • Lurker
      Member
      • Nov 2016
      • 83

      #3
      заббикс 6.*
      две строки для примера
      mos-sher18-2
      *mos-sher18-2* | additionalinfo
      1-я строка берётся непосредственно с оборудования
      2-я строка это то, что было когда-то забито руками(оно тоже забито на оборудовании и тянется по snmp). Надо проверить что руками забито правильно и не устарело. При чём формат записи строго не регламентирован. К примеру может быть так
      mos-sher18-2 additionalinfo

      Если через предобработку, то логика должна быть такой: от первой буквы(включительно), до первого символа, который не буква, не цифра и не "-" (исключительно).
      Но я сомневаю что на заббиксе можно сделать такую предобработку.

      Если решать задачу как частный случай, то т.к. проверку достаточно выполнять достаточно редко, то меня устроит выгрузка из заббикса в формате:
      hostname
      item1.last()
      item2.last()
      hostname2
      item1.last()
      item2.last()
      ...​
      Ну а дальше я распарсю самописным скриптом.

      Comment

      • Kos
        Senior Member
        Zabbix Certified SpecialistZabbix Certified Professional
        • Aug 2015
        • 3404

        #4
        Originally posted by Lurker
        Если через предобработку, то логика должна быть такой: от первой буквы(включительно), до первого символа, который не буква, не цифра и не "-" (исключительно).
        Но я сомневаю что на заббиксе можно сделать такую предобработку.
        Ну, если буквы подразумеваются только латинские, то без проблем - через регулярное выражение (впрочем, если буквы могут быть и кириллические, то выражение ненамного сложнее):
        RegEx Replacement
        (\w[\w\d-]*) \1

        Comment

        • Lurker
          Member
          • Nov 2016
          • 83

          #5
          Оказалось не без проблем. Буквы могут быть строчные\прописные. Писать по правилу предобработки на каждую букву, чтобы к одному виду привести или есть менее костыльное решение?
          А ещё я не понял, что значит \1? Нет я понимаю что смысл в том, что заменяем на тот кусок, что совпал, я не понимаю разницу \0 \1 \2 и т.д.

          Comment

          • Kos
            Senior Member
            Zabbix Certified SpecialistZabbix Certified Professional
            • Aug 2015
            • 3404

            #6
            Originally posted by Lurker
            Оказалось не без проблем. Буквы могут быть строчные\прописные. Писать по правилу предобработки на каждую букву, чтобы к одному виду привести или есть менее костыльное решение?
            Не совсем понял. Выражение "\w" обозначает знак подчёркивания, любую цифру или латинскую букву (независимо от регистра).
            Или вам сравнивать нужно два значения, которые могут иметь буквы в разных регистрах (т.е. иметь case-insensitive сравнение строк)? Тогда это уже другая задача, тут сравнение на равенство/неравенство не пройдёт; нужно будет каждую из строк приводить к какому-то одному регистру (той же предобработкой, например, только в данном случае проще будет, наверное, это сделать через JavaScript).
            Originally posted by Lurker
            А ещё я не понял, что значит \1? Нет я понимаю что смысл в том, что заменяем на тот кусок, что совпал, я не понимаю разницу \0 \1 \2 и т.д.

            Ну почитайте хоть на Википедии про группировку с захватом символов в регулярных выражениях, что ли (ссылка).
            Не просто совпал с регулярным выражением, а находится внутри захваченной группы символов (которая в регулярном выражении обозначается круглыми скобками). Ну, в моём примере всё выражение - это одна группа.
            Порядковые номера с 1 по 9 относятся к подстрокам в соответствующих (по порядку) захваченных группах символов, а 0 - к подстроке, соответствующей всему регулярному выражению.​

            Comment

            • Lurker
              Member
              • Nov 2016
              • 83

              #7
              мне нужно сравнивать две строки, которые в числе прочего могут быть в разных регистрах.
              Может джаваскриптом и проще, только я его не знаю. Похоже придётся учить.
              На счёт группировки. Но ведь в обычном регекспе оно относится к группе, а у нас к выражению, для этого даже отдельное поле выделено.(или как определяется к какой именно группе применяется, если в выражении их несколько?)

              Comment

              • Kos
                Senior Member
                Zabbix Certified SpecialistZabbix Certified Professional
                • Aug 2015
                • 3404

                #8
                Originally posted by Lurker
                мне нужно сравнивать две строки, которые в числе прочего могут быть в разных регистрах.
                Может джаваскриптом и проще, только я его не знаю. Похоже придётся учить.
                Делаете единственный шаг предобработки с типом "JavaScript" и следующим кодом:
                Code:
                value = value.replace(/\W*(\w[\w\d-]*).*/,"$1");
                return value.toLowerCase();​
                Originally posted by Lurker
                На счёт группировки. Но ведь в обычном регекспе оно относится к группе, а у нас к выражению, для этого даже отдельное поле выделено.(или как определяется к какой именно группе применяется, если в выражении их несколько?)
                \1 - первая группа захвата в регулярном выражении, \2 - вторая и так далее.
                При настройке через веб-интерфейс шага предобработки с типом "регулярное выражение" у вас будет два поля: в одном - само регулярное выражение, в другом - то, что вместо него нужно подставить. В общем случае, в регулярном выражении может быть несколько групп захвата. Например, если приходящее значение имеет вид "Имя Фамилия" (через один или несколько пробелов), а мы хотим поменять их местами (сначала фамилия, а потом имя) и сократить пробелы до одного, то можно сделать так:
                RegEx Replacement
                (\S+)\s+(\S+) \2 \1
                ​Т.е. сначала выводим то, что попадает во вторую группу (идущих подряд непробельных символов), затем выводим пробел, а затем - содержимое первой группы.

                Comment

                Working...