3 votes

Extraction du dernier mot/texte en correspondance multiple logstash

J'ai un pipeline Logstash pour ingérer un fichier entier, code multiligne utilisé. Je voudrais obtenir tous les événements correspondants et extraire uniquement le dernier mot ou texte. Je n'arrive pas à faire fonctionner une expression régulière.

Contenu du fichier

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

Correspondance requise

Trouver toutes les lignes contenant "extraire ceci" et récupérer le dernier mot/texte

Résultat attendu

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

Pipeline Logstash

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 } 
}

La sortie actuelle

{
    "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
}

2voto

Wiktor Stribiżew Points 100073

Vous pouvez utiliser la regex suivante :

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

Il correspondra

  • extract this - à la lettre
  • .*? - tous les caractères 0+ autres que les caractères de saut de ligne, aussi peu que possible
  • (\d[\d,]*) - Groupe 1 (ce que scan retours) : un chiffre suivi de 0+ chiffres ou de virgules
  • \r? - un CR (retour chariot) facultatif
  • $ - la fin d'une ligne.

Notez que puisque les fins de ligne dans votre fichier sont des CRLF, vous ne pouvez pas faire correspondre la position de fin de ligne avec un simple $ vous devez utiliser \r?$ .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X