logstash regex соответствует условию if

И решение с использованием awk:

awk -F';' '{ gsub(/ /,"");}
           NR==1 { cols = split($0, col); }
           NR > 2 { for (i = 2; i <= cols; i++) {
                        data[col[i]";"$1] = $1";"col[i]";"$i; }
                  }
           END { no = asorti(data, sorted);
                 for (i = 1; i <= no; i++) {
                     print data[sorted[i]]; }
               }' input
1
02.11.2017, 02:55
1 ответ

@sudobash хорошо, обновляю свой предыдущий комментарий, это было не решение, а скорее вопрос. Я знаю, что этот вопрос уже давно не задавался, но вот решение на случай, если оно кому-то понадобится в будущем:


Если вы наведете указатель мыши на поле «теги», вы увидите, что это должно быть поле «Строка», что неверно , и вот как вы можете подтвердить это :] Согласно официальной документации Elasticsearch , при фильтрации можно использовать следующие условия:

equality: ==, !=, <, >, <=, >=
regexp: =~, !~ (checks a pattern on the right against a string value on the left)
inclusion: in, not in

Если вы обратите внимание, вы увидите, что вы можете использовать «regexp» для сравнения строк, но почему это не работает для «тегов»? Что ж, ответ заключается в том, что «теги» не являются строковым полем, это поле/объект «массива» , поэтому любое сравнение должно указывать на определенные позиции массива.

Если, например, вы используете этот фильтр в конвейере Logstash:

filter {
  if [tags][0] =~ /foo.*/ {
     mutate { add_tag => "worked" }
  }
}

он будет работать так, как ожидалось, в приведенном выше примере, если позиция [0] «тегов» соответствует условию регулярного выражения «foo. *», новое значение («работает» )будет добавлен в массив тегов.

Теперь я понимаю, что в реальной жизни это не будет полезно, потому что вы, вероятно, не знаете позицию в массиве тега, который хотите сравнить, верно? Таким образом, из коробки нет способа добиться этого, для этого вам придется использовать рубиновый фильтр. Обратитесь к этому посту .

Вот базовый рубиновый фильтр, который будет делать то же самое, что я делал в предыдущем примере с фильтром, но на этот раз он будет делать это динамически:

filter {
  ruby {
    code => '
        mbool = 0
        event.get("tags").each_index { |x|
          if event.get("tags")[x] =~ /foo.*/
            mbool = 1
          end
        }
        if mbool == 1
          event.tag("ruby-worked")
        end
    '
}

Конечно,это зависит от того, чего вы хотите достичь в конце, но я почти уверен, что этот пост будет полезен.

0
13.10.2021, 20:22

Теги

Похожие вопросы