ШЕСТНАДЦАТЕРИЧНАЯ строка в двоичную и двоичная в десятичную в лог-тайнике с использованием фильтра ruby

#ruby #logstash

Вопрос:

Я работаю с logstash и использую фильтр ruby для изменения шестнадцатеричного на десятичный, который отлично работает для одного набора данных. То, что я использую для этого, — это ;

 ruby{
        code => "event.set('xxx', event.get('xx').hex)"
    }
 

Я ищу что-то подобное, что преобразует шестнадцатеричное в двоичное, а затем также преобразует его в десятичное после того, как я столкнусь с patterm.Причина, по которой мне нужно это сделать, заключается в том, что я выбираю неравномерные биты из шестнадцатеричных значений, например

Шестнадцатеричная строка — «ABC» ДВОИЧНАЯ — «101010111100»

Затем я буду использовать GROK , чтобы выбрать только первые три бита «101» и преобразовать в десятичное поле, которое является значением, которое я хочу, а также, например, следующий «010» в другое поле. Я просто нуждаюсь в помощи в двух преобразованиях.Не Грок

Ответ №1:

Вы можете выполнить преобразования, используя to_i и to_s и указав базу

     mutate { add_field => { "[HexNum]" => "4a" } }
    ruby {
        code => '
            hexNum = event.get("HexNum")
            event.set("binNum", hexNum.to_i(16).to_s(2))
        '
    }
 

Затем вы можете использовать свой фильтр grok, чтобы выбрать нужные части [binNum] и поместить их в пару полей, а затем преобразовать их в десятичные

     ruby {
        code => '
            event.set("field1", event.get("field1").to_i(2).to_s)
            event.set("field2", event.get("field2").to_i(2).to_s)
        '
    }
 

Комментарии:

1. эй, большое вам спасибо за ответ. только одно. Пример будет работать, если моя часть разделена на 3 части. Мой пример отличается тем, что, например, как только я получу двоичный файл 1111010101010,я захочу выбрать символы 1-3, т. е. «111» в качестве поля 1, затем, возможно, символы (8-13), я, e «101010»поле 2 и т. Д

2. Как бы вы разделили поле с помощью grok, с которым, как вы сказали, вам не нужна помощь. Трудно сказать, как «возможно» разделить поле.

3. я использовал Grok для разделения преобразованного двоичного сообщения, как показано ниже grok { match => {«Шестнадцатеричное число» =>> «(?>><игнорировать>.{220})(?<игнорировать><поле 1>.{10})(?<поле 1><поле 2>.{4})(?<поле 2><поле 3>.{24})(?<поле 3><поле 1>.{18}) и т. д. и т. д. }