Extraire le dernier élément de chaque ligne en regex

Extraire le dernier élément de chaque ligne

Bonjour à tous, aujourd’hui un petit TP sur les expressions régulières. J’ai un collègue qui m’a demandé comment on pouvait Extraire le dernier élément de chaque ligne dans un bout de texte de quelques centaines de lignes. Voici un exemple de format :

IP Address 595,537
IPv6 Address 1,443
MAC Address 0
MD5 163,573

La première version de la regex que j’ai proposée est simple au possible :

([^\s]+)$

Qui signifie en gros : « tout, sauf les espaces avant la fin de chaque ligne ». Cette expression a quand même un problème avec ses performances (326 steps sur regex101) dans la mesure le moteur d’évaluation avance dans le texte, il ne part pas de la fin et va donc avancer dans chaque mot avant de « backtracker », si celui ci n’est pas suivi de la fin de ligne.

Du coup, j’ai pu proposer une première version optimisée :

^.*?\s([^\s]+)$

C’est l’une des rares cas que j’ai croisé où l’usage d’un .* rends l’expression plus performante (120 steps sur le même texte) en l’obligeant à aller à la fin de ligne directement avant de matcher le dernier bloc. D’après regex101, on est donc déjà 3 fois plus … Lire la suite

Key=Value en regex, extraction en PowerShell

Key=Value en Regex

Salut à tous, aujourd’hui je vous propose un focus sur la capture de structures répétées type Key=Value en Regex (ou expression régulières). C’est pas bien compliqué mais il semble qu’il y en ai quelques uns qui ne soit pas au courant du comment faire (et pour ceux qui savent même pas les comment/quoi des regex c’est par ici).

Comme un bon exemple est toujours plus parlant voici le genre de structure qu’on veut extraire :

key1="valueA" key2="valueB" key3="valueC"

Celui qui débute avec les regex aura surement envie d’écrire une regex de ce type:

(key1=\".*\") (key2=\".*\") (key3=\".*\")

Sauf que cette expression de capture des Key=Value en Regex, en plus d’être peu optimisée, n’est pas généralisable. J’entends que si le texte à analyser ne contient pas toujours les mêmes clés et pas forcément le même nombre entre plusieurs lignes. Exemple où cela ne fonctionne plus :

key1="valueA" key2="valueB" key3="valueC"
key1="valueA" key3="valueB" key5="valueC" key0="valueC"
key2="valueB" key52="valueC"

Du coup, là, on va commencer à devoir faire de vraies expressions régulières.

Première optimisation

Déjà, il est souhaitable ne pas utiliser

(.*) # "n'importe quoi plusieurs fois"

mais lui préférer :

([^=]+)= #"Tout jusqu'à un caractère spécifique"

Deuxième optimisation

Plutôt que simplement des groupes de … Lire la suite

Splunk certbot et Let’s Encrypt App

Splunk certbot et Let's Encrypt

Je continue un peu sur Splunk, ce coup-ci j’ai fait une TA Splunk certbot et Let’s Encrypt. J’en ai eu un peu marre de déboguer les enrôlements certbot sans Splunk. Donc comme la dernière fois, j’ai fait une TA supportant le format de log de certbot actuel (versions 0.28.0). J’ai appliqué la même démarche que pour VSFTPD et fail2ban avec le Splunk Add-on Builder.

CLI Packaging

A la nuance qu’au moment de publier, j’ai fait l’update vers Splunk 8 qui m’a cassé le Add-on Builder… du coup j’ai du terminer en mode fichier et faire mes dernières modifs en mode CLI et par exemple packager avec :

./splunk package app TA-certbot

TLDR, elle est où cette TA Splunk certbot et Let’s Encrypt ?

Comme d’habitude, vous la trouverez sur la Splunkbase :

https://splunkbase.splunk.com/app/4758/

Modification de Limits.conf

Notez qu’il y a un configuration spécifique pour cette app. La regex que j’utilise est « un peu violente » (cf. explications ci-dessous). Du coup pour quelle soit fonctionnelle, il se peut (mais à priori ça marche quand même sans) que vous deviez modifier votre fichier limits.conf et rajouter le stanza suivant :

[rex]
depth_limit = 100000

Ce réglages permet d’augmenter la récursivité … Lire la suite

TP Powershell – String, Regex et petits poneys…

Petit TP PowerShell facile pour une fois, sur la gestion des chaînes de caractères (ou String).
Admettons, pour commencer que l’on est fait un bout de script qui récupère les comptes machines de nos serveurs avec leurs dates de création.

Premier exercice cash ! Écrivez cette commande PowerShell avec Get-ADComputer.

Pour les autres, la solution ci-dessous très bien cachée.

PS C:\> $tab = Get-ADComputer -SearchBase 'OU=Serveurs,DC=equestria,DC=com' -SearchScope Subtree -Filter * -Properties whencreated

Bon, et si on cherche à tester les serveurs donc le nom commence par ‘Pony-‘ pour avoir nos serveurs du projet poney ? Pour commencer doucement on va le faire avec une boucle FOR.

#Ici on crée un tableau vide
$srv_pony = @()

#Pour chaque élément du tableau de tous les serveurs
ForEach($srv in $tab){
    #Si le nom commence par pony
    if($srv.name -match '^pony\-*'){
        #On l’ajoute dans le tableau
        $srv_pony += $srv
    }
}

On récupère alors les serveurs dans l’Active Directory dont le nom de machine commence par pony-. Ceux qui ne connaissent pas ont sûrement remarqué que mon « -match » est un peu étrange. En fait j’utilise la syntaxe des expressions régulières. Les expressions régulières sont avant tout un modèle théorique (utilisé en compilation par … Lire la suite