Checkmk
to checkmk.com
Important

This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved.

1. Introduction

Les expressions régulières — regex (ou, plus rarement, regexp) — sont utilisées dans Checkmk pour spécifier les noms des services et dans de nombreuses autres situations. Il s’agit de modèles qui saisissent un certain texte ou qui ne saisissent pas (non-saisie). Elles permettent de réaliser de nombreuses opérations pratiques, telles que la formulation de règles flexibles s’appliquant à tous les services dont le nom contient foo ou bar.

Les expressions régulières sont souvent confondues avec les modèles de recherche de noms de fichiers, car les caractères spéciaux * et ?, ainsi que les crochets et les accolades, peuvent apparaître dans les deux.

Dans cet article, nous vous présenterons les fonctions les plus importantes des expressions régulières, bien sûr dans le contexte de Checkmk. Étant donné que Checkmk utilise deux composants différents pour les expressions régulières, le diable se cache parfois dans les détails. En substance, le noyau de supervision utilise la bibliothèque C et tous les autres composants utilisent Python 3. Lorsque des différences existent, nous les expliquerons.

Tip

Dans Checkmk, les expressions régulières sont autorisées dans les champs de saisie de différentes pages. En cas de doute, utilisez l’aide contextuelle via le menu «Help» (Help > Show inline help). Vous pourrez y voir si les expressions régulières sont autorisées et comment les utiliser.

Lorsque vous travaillez avec des plugins plus anciens ou provenant de sources externes, il peut arriver que ceux-ci utilisent Python 2 ou Perl et s'écartent des conventions décrites ici.

Dans cet article, nous vous présenterons les fonctionnalités les plus importantes des expressions régulières — mais en aucun cas toutes. Si les possibilités présentées ici ne vous suffisent pas, vous trouverez ci-dessous des références où vous pourrez consulter tous les détails pertinents. Et puis, il y a toujours internet.

Si vous souhaitez programmer vos propres plugins qui, par exemple, utilisent des expressions régulières pour détecter des anomalies dans des fichiers journaux, vous pouvez vous appuyer sur cet article. Toutefois, lors de la recherche dans de grands volumes de données, l’optimisation des performances est un aspect important. En cas de doute, consultez toujours la documentation de la bibliothèque d’expressions régulières utilisée.

2. Utilisation des expressions régulières

Dans cette section, nous utilisons des exemples concrets pour montrer comment utiliser les expressions régulières, depuis la saisie simple de caractères ou de chaînes uniques jusqu'aux groupes de correspondance complexes de caractères.

2.1. Caractères alphanumériques

Avec les expressions régulières, il s’agit toujours de déterminer si un motif saisit un texte donné (par exemple, le nom du service). L’exemple d’application le plus simple est une chaîne de caractères alphanumériques. Ces caractères (ainsi que le signe moins utilisé comme trait d’union) saisissent simplement eux-mêmes dans une expression.

Lors d’une recherche dans l’environnement de supervision, Checkmk ne fait généralement pas la distinction entre majuscules et minuscules. Dans la plupart des cas, l’expression CPU load saisit aussi bien le texte CPU load que cpu LoAd. En revanche, la recherche dans l’environnement de configuration tient généralement compte de la casse. Des exceptions justifiées à ces règles sont possibles et sont décrites dans l’aide en ligne.

Tip

Dans les champs de saisie sans expression régulière où une correspondance exacte est spécifiée (principalement avec les noms de domaine), la distinction entre majuscules et minuscules est toujours appliquée !

2.2. Le point ( . ) en tant que caractère générique

Outre les chaînes de caractères « en texte brut », il existe un certain nombre de caractères et de chaînes de caractères dotés de fonctions « magiques ». Le caractère le plus important parmi ceux-ci est le point (.). Il saisit exactement n’importe quel caractère unique :

Expression régulière Correspondance Pas de correspondance

Me.er

Meier
Meyer

Meyyer

.var.log

1var2log
/var/log

/var//log

2.3. Répétition de caractères

On souhaite très souvent définir qu’une séquence de caractères d’une certaine longueur puisse apparaître. À cette fin, on spécifie le nombre de répétitions du caractère précédent entre accolades :

Expression régulière Fonction Correspondance Pas de correspondance

Ax{2,5}B

x apparaît au moins deux fois mais pas plus de cinq fois

AxxB
AxxxxB

AxB
AxxxxxxB

Ax{0,5}B

x apparaît au maximum cinq fois, mais n'est pas obligatoire

AB
AxxxxxB

AxxxxxxB

Ax{3}B

x apparaît exactement trois fois

AxxxB

AxxB
AxxxxB

Ax{0,}B

x peut apparaître un nombre quelconque de fois

AB
AxxxxxxB

Ax{1,}B

x apparaît au moins une fois

AxB
AxxxxxB

AB

Ax{0,1}B

x apparaît au plus une fois

AB
AxB

AxxB

Il existe des abréviations pour les trois dernières conditions ci-dessus : « *» saisit le caractère précédent un nombre indéfini de fois, « + » saisit au moins une occurrence et « ? » saisit au plus une occurrence.

Vous pouvez également utiliser l'.e du point avec les opérateurs de répétition pour rechercher une séquence de caractères arbitraires de manière plus précise :

Expression régulière Correspondance Pas de correspondance

State.*OK

State is OK
State = OK
StateOK

StatOK

State*OK

StateOK
StatOK

State OK

a *= *5

a=5
a = 5

a==5

State.+OK

State is OK
State=OK
State OK

StateOK

State.?OK

State=OK
State OK
StateOK

State is OK

2.4. Classes de caractères, chiffres et lettres

Les classes de caractères permettent de saisir certaines sections du jeu de caractères, par exemple « il doit y avoir un chiffre ici ». Pour ce faire, placez tous les caractères à saisir entre crochets. À l'aide d'un signe moins, vous pouvez également spécifier des plages. Remarque : la séquence du jeu de caractères ASCII 7 bits s'applique.

Par exemple, [abc] représente exactement l’un des caractères a, b ou c, et [0-9] représente n’importe quel chiffre — les deux peuvent être combinés. Une négation de l’ensemble est également possible — avec un signe « - » entre parenthèses, [^abc] représente alors n’importe quel caractère sauf a, b, c.

Les classes de caractères peuvent bien sûr être combinées avec d’autres opérateurs. Commençons par quelques exemples abstraits :

Classe de caractères Fonction

[abc]

Exactement l’un des caractères a, b, c.

[0-9a-z_]

Exactement un chiffre, une lettre minuscule ou un trait de soulignement.

[^abc]

Tout caractère autre que a, b, c.

[ --]

Exactement un caractère, allant d'un espace à un tiret, conforme à la norme ASCII. Les caractères suivants font partie de cette plage : !"#$%&'()*+,

[0-9a-z]{1,20}

Une séquence d'au moins un et d'au plus 20 lettres et/ou chiffres, dans n'importe quel ordre.

Voici quelques exemples concrets :

Expression régulière Correspondance Pas de correspondance

[0-7]

0
5

9

[0-7]{2}

00
53

183

M[ae]{1}[iy]{1}e?r

Meier
Meyer
Mayr

Myers

myhost_[0-9a-z_]{3}

myhost_1a3
myhost_1_5

myhost_xy

[0-9/ ()-]

+49 89 998209700
089 / 9982 097-00

089 : 9982 097-00
(ici, seul le groupe précédant les deux points est saisi)

Tip

Si vous avez besoin de l'un des caractères -, [ ou ], vous devrez utiliser une astuce. Écrivez le signe moins (-) à la fin de la classe — comme déjà montré dans l'exemple précédent. Lors de l'évaluation des expressions régulières, le signe moins, s'il ne se trouve pas au milieu de trois caractères, n'est pas évalué comme un opérateur, mais exactement comme ce caractère. Si nécessaire, insérez un crochet fermant comme premier caractère de la classe, et un crochet ouvrant comme deuxième caractère. Comme aucune classe vide n’est autorisée, le crochet fermant est alors interprété comme un caractère normal. Une classe comportant ces caractères spéciaux ressemblerait à ceci : []-], ou respectivement [][-] si le crochet ouvrant est également nécessaire.

2.5. Début et fin — préfixe, suffixe et infixe

Dans de nombreux cas, il est nécessaire de distinguer les correspondances au début, à la fin ou simplement quelque part au sein d’une chaîne. Pour une correspondance au début d’une chaîne (correspondance de préfixe), utilisez l’^ (accent circonflexe) ; pour la fin (correspondance de suffixe), utilisez l’$ (signe dollar). Si aucun de ces opérateurs n’est spécifié, la plupart des bibliothèques d’expressions régulières utilisent la correspondance d’infixe par défaut — la recherche s’effectue n’importe où dans la chaîne de caractères. Pour des correspondances exactes, utilisez à la fois ^ et $.

Expression régulière Correspondance Pas de correspondance

/var

/var
/var/log
/usr/var

^/var

/var
/var/log

/usr/var

/var$

/var
/usr/var

/var/log

^/var$

/var

/var/log
/usr/var

Dans la supervision et l'Event Console, la correspondance d'infixe est la norme. Dans la supervision, la correspondance d'infixe est la norme. Les expressions apparaissant n'importe où dans le texte sont trouvées ; par exemple, la recherche de « memory » trouve également « kernel memory ». Dans l'interface graphique de configuration, en revanche, lors de la comparaison d'expressions régulières avec les noms des services et d'autres éléments, Checkmk vérifie essentiellement si l'expression correspond au début du texte (correspondance de préfixe) — c'est généralement ce que vous recherchez :

regexes servicematch

Si vous avez besoin d’une correspondance d’infixe là où la correspondance de préfixe est proposée, il vous suffit d’étendre votre expression régulière en ajoutant «.*» au début pour qu’elle saisisse n’importe quelle chaîne préfixée :

Expression régulière Correspondance Pas de correspondance

/var

/var
/var/log

/usr/var

.*/var

/var
/usr/var
/var/log

/var$

/var

/var/log
/usr/var

Astuce : vous pouvez faire précéder toute recherche au début d’une chaîne par ^ et toute recherche au sein d’une chaîne par .*, les interpréteurs d’expressions régulières ignoreront les symboles redondants.

2.6. Masquage des caractères spéciaux à l'aide d'une barre oblique inversée

Étant donné que le point correspond à tout, il correspond naturellement aussi à un point. Si vous souhaitez désormais faire correspondre exactement un point, vous devez le masquer avec un \ (barre oblique inversée). Cela s'applique de manière analogue à tous les autres caractères spéciaux. Il s'agit de : \ . * + ? { } ( ) [ ] | & ^ et $. Le codage d'une barre oblique inversée \ a pour effet que le caractère spécial qui la suit est traité comme un caractère normal :

Expression régulière Correspondance Pas de correspondance

example\.com

example.com

example\.com
example-com

How\?

How?

How\?
How

C:\\Programs

C:\Programs

C:Programs
C:\\Programs

Attention Python : Étant donné qu'en Python, la barre oblique inversée dans la représentation interne de la chaîne est masquée en interne par une autre barre oblique inversée, ces deux barres obliques inversées doivent être masquées à nouveau, ce qui conduit à un total de quatre barres obliques inversées :

Expression régulière Correspondance Pas de correspondance

C:\\\\Programs

C:\Programs

C:Programs
C:\\Programs

2.7. Valeurs alternatives

Avec la barre verticale |, vous pouvez définir des alternatives, c'est-à-dire utiliser un opérateur OU : 1|2|3saisit 1, 2 ou 3. Si vous avez besoin de telles alternatives au milieu d'une expression, regroupez-les entre parenthèses :

Expression régulière Correspondance Pas de correspondance

CPU load|Kernel|Memory

CPU load
Kernel

CPU utilization

01|02|1[1-5]



01 02 11 bis 15

05

2.8. Groupes de correspondance

Les groupes de correspondance (ou groupes de capture) remplissent deux fonctions : La première fonction consiste à regrouper des alternatives ou des correspondances partielles, comme le montre l'exemple précédent. Des regroupements imbriqués sont également possibles. De plus, les opérateurs de répétition *, +, ? et {…​} peuvent être utilisés précédés de parenthèses. Ainsi, l'expression (/local)?/share correspond à la fois à /local/share et à /share.

La deuxième fonction consiste à « capturer » les groupes de correspondance de caractères dans des variables. Dans l’ Event Console (EC), l’informatique décisionnelle (BI), lors du renommage en masse d’ordinateurs hôtes et dans les affectations de ferroutage, il est possible d’utiliser la partie de texte correspondant à l’expression régulière dans la première parenthèse comme \1 , la partie correspondant à la deuxième parenthèse comme \2 , et ainsi de suite. Le dernier exemple du tableau illustre l'utilisation d'alternatives au sein d'un groupe de correspondance.

Expression régulière Texte à saisir Groupe 1 Groupe 2

()([123])

def231

def

231

server-(.*)\.local

server-lnx02.local

lnx02

server\.(intern|dmz|123)\.net

server.dmz.net

dmz

L'image suivante illustre un tel renommage de plusieurs ordinateurs hôtes en une seule opération. Tous les noms de domaine correspondant à l'expression régulière server-(.*)\.local seront remplacés par \1.servers.local. Où l'\1e correspond exactement au texte « capturé » par l'.*e entre parenthèses :

bulk renaming regex

Dans l'exemple concret, server-lnx02.local est donc converti en lnx02.servers.local.

Si un groupe de correspondance n'est pas censé « capturer » des groupes de caractères, par exemple s'il est uniquement utilisé à des fins de structuration, ?: peut être utilisé pour le convertir en un groupe de correspondance sans capture (non-capturing match group) : (?:/local)?/share.

2.9. Indicateurs en ligne

Les indicateurs en ligne permettent de définir des paramètres spécifiques concernant le mode d’évaluation au sein d’une expression régulière. Le plus pertinent pour l’utilisation de Checkmk est (?i), qui active la correspondance insensible à la casse pour les expressions qui, autrement, seraient sensibles à la casse. Dans de très rares cas, vous souhaiterez également utiliser (?s) et (?m) pour travailler avec des chaînes multilignes.

Notez que depuis la version 3.11, Python attend des indicateurs en ligne soit au début d'une expression régulière — (?i)somestring — soit en spécifiant la portée — (?i:somestring). Étant donné que Checkmk combine dans certains cas les expressions régulières en interne pour améliorer les performances, nous vous recommandons vivement de ne pas utiliser d'indicateurs en ligne au début d'une expression régulière. Utilisez plutôt toujours la notation avec la portée — qui, en cas de doute, s'étend à l'ensemble de l'expression régulière :

(?i:somestring).

Il s'agit d'une variante du groupe de correspondance sans capture.

3. Tableau des caractères spéciaux

Vous trouverez ici une liste récapitulative de tous les caractères spéciaux et fonctions d'expressions régulières utilisés par Checkmk, comme expliqué ci-dessus :

.

saisit n'importe quel caractère.

`

Considère le caractère spécial suivant comme un caractère normal.

{5}

Le caractère précédent doit apparaître exactement cinq fois.

{5,10}

Le caractère précédent doit apparaître au moins cinq fois et au plus dix fois.

*

Le caractère précédent peut apparaître un nombre quelconque de fois (correspond à {0,}).

+

Le caractère précédent peut apparaître un nombre quelconque de fois, mais doit apparaître au moins une fois (équivalent à {1,}).

?

Le caractère précédent peut apparaître zéro ou une fois (équivalent à {0,1}).

[abc]

Représente exactement l'un des caractères a, b ou c.

[0-9]

Représente exactement l'un des caractères 0, 1…​ 9 (c'est-à-dire un chiffre).

[0-9a-z_]

Représente exactement un chiffre, une lettre minuscule ou le trait de soulignement.

[^"']

Représente exactement un caractère, à l'exception des guillemets simples ou doubles.

$

Saisit la fin d'un texte.

^

Saisit le début d'un texte.

A|B|C

Saisit A, B ou C.

(A)

Fait correspondre la sous-expression A à un groupe de correspondance.

(?i:A)

Modifie le mode d'évaluation de la sous-expression A pour qu'elle ne tienne pas compte de la casse, via l'indicateur inline.

\t

Saisit un caractère de tabulation. Ce caractère apparaît souvent dans les fichiers journaux ou les tableaux CSV.

\s

Saisit tous les espaces (l'ASCII utilise 5 types d'espaces différents).

Les caractères suivants doivent être masqués par une barre oblique inversée, s'ils doivent être utilisés littéralement : \ . * + ? { } ( ) [ ] | & ^ $.

3.1. Unicode in Python 3

En particulier, si des noms propres dans des commentaires ou des textes descriptifs ont été copiés-collés, et que par conséquent des caractères Unicode ou différents types d’espaces apparaissent dans le texte, les classes étendues de Python sont très utiles :

\t

Saisit une tabulation (tabulateur), notamment dans les fichiers journaux ou les tableaux CSV.

\s

Saisit tous les espaces (Unicode prend en charge 25 espaces différents, ASCII 5).

\S

Inverse la recherche de \s, c'est-à-dire saisit tous les caractères qui ne sont pas des espaces.

\w

Saisit tous les caractères qui font partie d'un mot, c'est-à-dire les lettres, et en Unicode également les accents, les glyphes chinois, arabes ou coréens.
Attention : les chiffres font ici partie du mot.

\W

Inversion de « \w », c'est-à-dire saisit tout ce qui ne fait généralement pas partie d'un mot (espaces, signes de ponctuation, émoticônes, caractères mathématiques spéciaux).

Dans les cas où Checkmk autorise la saisie Unicode, l'\w est particulièrement utile pour rechercher des mots s'écrivant de manière similaire dans différentes langues, par exemple des noms propres qui s'écrivent parfois avec et parfois sans accent.

Expression régulière Correspondance Pas de correspondance

\w{1,3}ni\w{1,2}el

Schnitzel (allemand)
șnițel (roumain)

šnicl (Croate)
Schnit'el (avec caractère d'omission)

4. Tester les expressions régulières

La logique des expressions régulières n'est pas toujours facile à comprendre, notamment dans le cas de groupes de correspondance imbriqués, ainsi que pour la question de l'ordre et de l'extrémité de la chaîne à faire correspondre. Plutôt que de procéder par essais et erreurs dans Checkmk, il existe deux façons de tester les expressions régulières : Des services en ligne tels que regex101.com présentent les correspondances sous forme graphique et expliquent l'ordre d'évaluation en temps réel :

regexes testing

La deuxième méthode de test est l'invite Python, fournie avec chaque installation de Python. Sous Linux et Mac OS, Python 3 est généralement préinstallé. C'est précisément parce que les expressions régulières à l'invite Python sont évaluées exactement comme dans Checkmk qu'il n'y a pas de divergences d'interprétation, même en cas d'imbrication complexe. Avec le test dans l'interpréteur Python, vous jouez toujours la carte de la sécurité.

Après l'ouverture, vous devez importer le module re. Dans l'exemple, nous désactivons la distinction entre majuscules et minuscules avec re.IGNORECASE :

OMD[mysite]:~$ python3
Python 3.8.10 (default, Jun  2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.IGNORECASE
re.IGNORECASE
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Pour émuler le comportement des expressions régulières de C, qui sont également utilisées dans de nombreux composants Python, vous pouvez vous limiter à l'ASCII :

>>> re.ASCII
re.ASCII

Vous pouvez désormais utiliser la fonction re.match() pour faire correspondre directement une expression régulière à une chaîne et afficher le groupe de correspondance : group(0)désigne la correspondance complète, et group(1) la première correspondance qui correspond à la sous-expression entre parenthèses :

>>> x = re.match('M[ae]{1}[iy]{1}e?r', 'Meier')
>>> x.group(0)
'Meier'
>>> x = re.match('M[ae]{1}[iy]{1}e?r', 'Mayr')
>>> x.group(0)
'Mayr'
>>> x = re.match('M[ae]{1}[iy]{1}e?r', 'Myers')
>>> x.group(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group
>>> x = re.match('server-(.*)\.local', 'server-lnx23.local')
>>> x.group(0)
'server-lnx23.local'
>>> x.group(1)
'lnx23'

5. Documentation externe complémentaire

Ken Thompson, l’un des créateurs d’Unix dans les années 1960, a été le premier à développer les expressions régulières sous leur forme actuelle, notamment dans l’instruction Unix «grep», qui est toujours utilisée aujourd’hui. Depuis lors, de nombreuses extensions et variantes des expressions régulières ont vu le jour, notamment les expressions régulières étendues, les expressions régulières compatibles avec Perl, ainsi qu’une variante très similaire en Python.

Dans les filtres des vues de la table, Checkmk utilise les expressions régulières étendues POSIX (extended REs). Celles-ci sont évaluées dans le noyau de supervision en C à l’aide de la fonction regex de la bibliothèque C. Vous trouverez une référence complète à ce sujet dans la page de manuel Linux de la commande regex(7) :

OMD[mysite]:~$ man 7 regex

REGEX(7)                   Linux Programmer's Manual                   REGEX(7)

NAME
       regex - POSIX.2 regular expressions

DESCRIPTION
       Regular expressions ("RE"s), as defined in POSIX.2, come in two forMFS:
       modern REs (roughly those of egrep; POSIX.2 calls these "extended" REs)
       and obsolete REs (roughly those of *ed*(1); POSIX.2 "basic" REs). Obso-
       lete REs mostly exist for backward compatibility in some old programs;
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Partout ailleurs, toutes les fonctions des expressions régulières de Python sont disponibles. Cela inclut, entre autres, les règles de configuration , les règles de configuration de l'Event Console (EC) et l'informatique décisionnelle (BI) .

Les expressions régulières en Python constituent une extension des expressions régulières étendues et sont très similaires à celles de Perl. Elles prennent en charge, par exemple, ce qu’on appelle le « negative lookahead », un astérisque non glouton dans les expressions régulières, ou encore la distinction entre majuscules et minuscules. Vous trouverez des détails sur les capacités de ces expressions régulières dans l’aide en ligne Python du module `re`, ou de manière plus approfondie dans la documentation en ligne de Python :

OMD[mysite]:~$ pydoc3 re
Help on module re:

NAME
    re - Support for regular expressions (RE).

MODULE REFERENCE
    https://docs.python.org/3.8/library/re

    The following documentation is automatically generated from the Python
    source files. It may be incomplete, incorrect or include features that
    are considered implementation detail and may vary between Python
    implementations. When in doubt, consult the module reference at the
    location listed above.

DESCRIPTION
    This module provides regular expression matching operations similar to
    those found in Perl. It supports both 8-bit and Unicode strings; both
    the pattern and the strings being processed can contain null bytes and
    characters outside the US ASCII range.

    Regular expressions can contain both special and ordinary characters.
    Most ordinary characters, like "A", "a", or "0", are the simplest
    regular expressions; they simply match themselves. You can
    concatenate ordinary characters, so last matches the string 'last'.
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Vous trouverez une explication très détaillée des expressions régulières dans un article de Wikipédia.


Last modified: Mon, 15 Dec 2025 13:54:09 GMT via commit 3e0be1a60
Sur cette page