Извлечение последнего слова / текста множественного соответствия logstash - PullRequest
3 голосов
/ 14 января 2020

У меня есть конвейер Logsta sh для приема всего файла, используется многострочный код. Я хотел бы получить все соответствующие события и извлечь только последнее слово или текст. Я не могу заставить работать любое регулярное выражение.

Содержимое файла

some line extract this 875846 85746,857
some other line
some other line with more text
let's extract this 887362        24153,44737
some other final line

Требуемое совпадение

Поиск всех строк содержит «извлечь это» и получить последнее слово / текст

Ожидаемый вывод

{
    "patternmatch1" => [
        [0] [
            [0] "85746,857"
        ],
        [1] [
            [0] "24153,44737"
        ]
    ],
       "@timestamp" => 2020-01-14T11:15:34.304Z
}

Logsta sh конвейер

input {
    file{
        path => "C:/file.txt"
        start_position => "beginning"
        sincedb_path => NUL
        codec => multiline { 
            pattern => "^nomatching"
            negate => true
            what => previous
            auto_flush_interval => 1
            multiline_tag => ""
        }
    }
}
filter {
  ruby { code => 'event.set("patternmatch1",event.get("message").scan(/extract this([^\r]*)/))' }
}
output {   
  stdout { codec => rubydebug } 
}

Токовый выход

{
    "patternmatch1" => [],
     "message" => "some line extract this 875846 85746,857\r\nsome other line\r\nsome other line with more text\r\nlet's extract this 887362        24153,44737\r\nsome other final line\r\n\r",
   "@timestamp" => 2020-01-14T11:44:50.140Z
}

1 Ответ

2 голосов
/ 14 января 2020

Вы можете использовать следующее регулярное выражение:

/extract this.*?(\d[\d,]*)\r?$/

Это будет соответствовать

  • extract this - буквально
  • .*? - любые 0+ символов кроме символов перевода строки как можно меньше
  • (\d[\d,]*) - Группа 1 (что возвращает scan): ди git, за которым следуют 0+ цифр или запятые
  • \r? - необязательный CR (возврат каретки)
  • $ - конец строки.

Обратите внимание, что, поскольку окончания строк в вашем файле являются CRLF, вы не можете сопоставить позицию конца строки с простым $, вы должны использовать \r?$.

...