Besoin d'aide regex

hsd75 Messages postés 3 Date d'inscription vendredi 30 décembre 2022 Statut Membre Dernière intervention 31 décembre 2022 - 30 déc. 2022 à 21:00
Whismeril Messages postés 19146 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2024 - 31 déc. 2022 à 12:07

Bonjour,

Je sollicite un expert regex.

Mon besoin est de parser des lignes de log. Voici 2 exemples de lignes dont je souhaite extraire l'IP en gras avec une expression unique :

firewall, action: drop, input: in:vlan-internet out:(unknown 0), connection-state:new src-mac 24:21:24:9d:3e:3f, proto UDP, 49.51.141.94:32099->10.153.10.24:28006, len 32
firewall, action: drop,  input: in:vlan-internet out:(unknown 0), connection-state:new src-mac cc:19:a8:64:a5:f1, proto 2, 1.1.1.1->224.0.0.1, len 32

J'ai créer l'expression suivante qui fonctionne sur la première ligne mais pas la seconde : ^.*, (.+):.*->.*$

Un contrainte de plus, l'expression doit commencer par ^ et se terminer par $ (contraintre de loggly)

Merci d'avance pour toute aide.

5 réponses

Whismeril Messages postés 19146 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2024 660
30 déc. 2022 à 21:21

Bonjour 

connais tu les sites de tester de regex, ça te permet de construire ta regex et de vérifier au fur et à mesure son comportement.

Il faut juste choisir un site qui te permet de choisir le même moteur de regex.

Par exemple, avec le moteur php https://regex101.com/api/regex/delete/7PPLeNtJ9gsfrlcZ3Nspfm1b


0
hsd75 Messages postés 3 Date d'inscription vendredi 30 décembre 2022 Statut Membre Dernière intervention 31 décembre 2022
Modifié le 30 déc. 2022 à 21:27

Merci, je connais es site et je l'utilise. 

Dans ce cas précis je sollicite l'aide de quelqu'un car je n'y arrive pas.

0
Whismeril Messages postés 19146 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2024 660
30 déc. 2022 à 23:07

Ha, j'ai fait une boulette, j'ai copié collé le lien de suppression de la regex...

Voilà qui est mieux

https://regex101.com/r/B1eTnz/1


0
hsd75 Messages postés 3 Date d'inscription vendredi 30 décembre 2022 Statut Membre Dernière intervention 31 décembre 2022
31 déc. 2022 à 00:01

Et bien mille merci. j'ai vraiment du mal avec ces expressions régulières.

C'est parfait, ça fonctionne, j'ai modifié en ceci car j'ai d'autre valeur "proto".

^.+proto (?:.*), (\d+\.\d+\.\d+\.\d+).+$

Merci encore pour cette aide.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19146 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2024 660
31 déc. 2022 à 09:12

De rien

tout d'abord, en remplaçant par .*, tu n'as plus besoin de (?:) qui servait à délimiter le "ou" de UDP|2 sans les parenthèses, le ou prendrait tout avant le pipe ou tout après le pipe.

L'ajout de ?: signale que ces parenthèses ne sont pas un groupe de capture. Raison pour laquelle, dans mon exemple, tu n'as que la capture complète et l'IP.

Donc ceci

^.+proto .*, (\d+\.\d+\.\d+\.\d+).+$

est la même chose en plus simple.


Par contre, selon le moteur de regex qu'utilise ton logiciel, .* peut avoir un effet pervers.

En effet, en gros le modèle qu'on cherche, c'est "début" puis n'importe quoi 1, puis proto, puis n'importe quoi 2, puis virgule espace (c'est ce qui nous sauve pour l'instant), puis une IP, puis n'importe quoi 3 et "fin"

Supposons que pour une ligne, la seconde IP n'est pas précédée de "->" mais de ", " dans ce cas la regex aura le choix entre un "n'importe quoi 2 court et une IP et un "n'importe quoi 2 long" et une IP.

Si tu es certain que jamais la 2eme IP ne sera précédée par ", " alors cette regex fonctionnera toujours.

Si tu n'es pas certain, il serait sage de la blinder un peu.


0
Whismeril Messages postés 19146 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2024 660
31 déc. 2022 à 12:07

D'ailleurs, si tu es sûr et certain que la première IP est toujours précédée de ", " et que la seconde non, alors on peut faire encore plus simple.

https://regex101.com/r/B1eTnz/2

^.+, (\d+\.\d+\.\d+\.\d+).+$

Ou mieux encore, si ton logiciel utilise un moteur regex qui accepte les "lookahead assertion" de longueur variable (comme le moteur .Net, contrairement au moteur PHP)

https://regex101.com/r/B1eTnz/3

(?<=^.+, )\d+\.\d+\.\d+\.\d+(?=.+$)

Il faut essayer pour savoir.

0
Rejoignez-nous