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. Introduzione

Le espressioni regolari — regex (o, più raramente, regexp) — vengono utilizzate in Checkmk per specificare i nomi dei servizi e in molte altre situazioni. Si tratta di modelli che corrispondono a un determinato testo o che non corrispondono (non-match). Puoi utilizzarle per molte operazioni pratiche, come formulare regole flessibili che si applicano a tutti i servizi con foo o bar nel loro nome.

Le espressioni regolari vengono spesso confuse con i modelli di ricerca dei nomi dei file, poiché i caratteri speciali * e ?, così come le parentesi quadre e graffe, possono essere presenti in entrambi.

In questo articolo ti mostreremo le funzioni più importanti delle espressioni regolari, ovviamente nel contesto di Checkmk. Dato che Checkmk utilizza due componenti diverse per le espressioni regolari, a volte il diavolo si nasconde nei dettagli. In sostanza, il nucleo di monitoraggio utilizza la libreria C e tutti gli altri componenti utilizzano Python 3. Laddove esistono differenze, te le spiegheremo.

Tip

In Checkmk, le espressioni regolari sono consentite nei campi di immissione dati su varie pagine. Se non sei sicuro, usa l’aiuto contestuale tramite il menu “Help” (Help > Show inline help). Lì puoi vedere se le espressioni regolari sono consentite e come possono essere utilizzate.

Quando si lavora con plug-in più vecchi o provenienti da fonti esterne, può capitare che questi utilizzino Python 2 o Perl e si discostino dalle convenzioni qui descritte.

In questo articolo ti mostreremo le funzionalità più importanti delle espressioni regolari, ma non certo tutte. Se le possibilità illustrate qui non ti bastano, di seguito troverai alcuni riferimenti dove potrai leggere tutti i dettagli rilevanti. E poi c'è sempre internet.

Se vuoi programmare i tuoi plug-in che, ad esempio, utilizzano espressioni regolari per individuare anomalie nei file di log, puoi usare questo articolo come base. Tuttavia, quando si effettuano ricerche in grandi volumi di dati, l'ottimizzazione della performance è un aspetto importante. In caso di dubbio, consulta sempre la documentazione della libreria regex che stai utilizzando.

2. Lavorare con le espressioni regolari

In questa sezione useremo esempi concreti per mostrare come lavorare con le espressioni regolari, dalle semplici corrispondenze di singoli caratteri o stringhe, fino a gruppi complessi di caratteri.

2.1. Caratteri alfanumerici

Con le espressioni regolari, si tratta sempre di verificare se un modello corrisponde a un determinato testo (ad es. il nome del servizio). L'esempio di applicazione più semplice è una sequenza di caratteri alfanumerici. Questi (e il segno meno usato come trattino) corrispondono semplicemente a se stessi in un'espressione.

Quando si effettua una ricerca nell'ambiente di monitoraggio, Checkmk di solito non fa distinzione tra maiuscole e minuscole. Nella maggior parte dei casi, l'espressione CPU load corrisponde sia al testo CPU load che a cpu LoAd. La ricerca nell'ambiente di configurazione, invece, di solito fa distinzione tra maiuscole e minuscole. Sono possibili eccezioni giustificate a queste regole, descritte nell'aiuto in linea.

Tip

Nei campi di immissione senza espressione regolare in cui è specificata una corrispondenza esatta (principalmente con i nomi host), si distingue sempre tra maiuscole e minuscole!

2.2. Il punto ( . ) come carattere jolly

Oltre alle stringhe di caratteri "in chiaro", ci sono diversi caratteri e stringhe che hanno funzioni "magiche". Il carattere più importante è il punto (.). Corrisponde esattamente a qualsiasi singolo carattere arbitrario:

Espressione regolare Corrispondenza Nessuna corrispondenza

Me.er

Meier
Meyer

Meyyer

.var.log

1var2log
/var/log

/var//log

2.3. Ripetizione di caratteri

Molto spesso si vorrebbe definire che possa verificarsi una sequenza di caratteri di una certa lunghezza. A questo scopo si specifica il numero di ripetizioni del carattere precedente tra parentesi graffe:

Espressione regolare Funzione Corrispondenza Nessuna corrispondenza

Ax{2,5}B

x si verifica almeno due volte ma non più di cinque volte

AxxB
AxxxxB

AxB
AxxxxxxB

Ax{0,5}B

x si verifica al massimo cinque volte, ma non è necessario che si verifichi

AB
AxxxxxB

AxxxxxxB

Ax{3}B

x si verifica esattamente tre volte

AxxxB

AxxB
AxxxxB

Ax{0,}B

x può verificarsi un numero qualsiasi di volte

AB
AxxxxxxB

Ax{1,}B

x si verifica almeno una volta

AxB
AxxxxxB

AB

Ax{0,1}B

x si verifica non più di una volta

AB
AxB

AxxB

Esistono delle abbreviazioni per le ultime tre condizioni sopra indicate: *corrisponde al carattere precedente un numero qualsiasi di volte, + corrisponde ad almeno un'occorrenza e ? corrisponde al massimo a un'occorrenza.

Puoi anche usare il punto . con gli operatori di ripetizione per cercare una sequenza di caratteri arbitrari in modo più definito:

Espressione regolare Corrispondenza Nessuna corrispondenza

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. Classi di caratteri, numeri e lettere

Le classi di caratteri consentono di corrispondere in determinate sezioni del set di caratteri, ad esempio "qui deve esserci una cifra". Per farlo, metti tutti i caratteri da cercare tra parentesi quadre. Con il segno meno puoi anche specificare intervalli. Nota: si applica la sequenza del set di caratteri ASCII a 7 bit.

Ad esempio, [abc] sta per esattamente uno dei caratteri a, b o c, e [0-9] per qualsiasi cifra — entrambi possono essere combinati. È possibile anche una negazione dell'insieme — con un ^ tra parentesi, [^abc] sta quindi per qualsiasi carattere tranne a, b, c.

Le classi di caratteri possono ovviamente essere combinate con altri operatori. Cominciamo con alcuni esempi astratti:

Classe di caratteri Funzione

[abc]

Esattamente uno dei caratteri a, b, c.

[0-9a-z_]

Esattamente una cifra, una lettera minuscola o un trattino basso.

[^abc]

Qualsiasi carattere tranne a, b, c.

[ --]

Esattamente un carattere, che va da uno spazio a un trattino, conforme allo standard ASCII. I seguenti caratteri rientrano in questo intervallo: !"#$%&'()*+,

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

Una sequenza di almeno una e al massimo 20 lettere e/o cifre in qualsiasi ordine.

Ecco alcuni esempi pratici:

Espressione regolare Corrispondenza Nessuna corrispondenza

[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
(qui viene trovato solo il gruppo di corrispondenza prima dei due punti)

Tip

Se hai bisogno di uno dei caratteri -, [ o ], dovrai ricorrere a un trucco. Scrivi il segno meno (-) alla fine della classe, come già mostrato nell'esempio precedente. Durante la valutazione delle espressioni regolari, il segno meno, se non si trova al centro di tre caratteri, non viene interpretato come operatore, ma proprio come questo carattere. Se necessario, inserisci una parentesi quadra chiusa come primo carattere della classe e una parentesi quadra aperta come secondo carattere. Poiché non sono ammesse classi vuote, la parentesi quadra chiusa viene quindi interpretata come un carattere normale. Una classe con questi caratteri speciali avrebbe questo aspetto: []-], o rispettivamente [][-] se è necessaria anche la parentesi quadra aperta.

2.5. Inizio e fine — prefisso, suffisso e infisso

In molti casi è necessario distinguere tra corrispondenze all'inizio, alla fine o semplicemente in un punto qualsiasi all'interno di una stringa. Per una corrispondenza all'inizio di una stringa (match inizio parola (prefisso)) usa l'^o (circonflesso), per la fine (match fine parola (suffisso)) usa l'$o (segno del dollaro). Se nessuno di questi operatori è specificato, la maggior parte delle librerie di espressioni regolari usa il match parziale come impostazione predefinita — viene cercato in qualsiasi punto della stringa di caratteri. Per una corrispondenza esatta, usa sia ^ che $.

Espressione regolare Corrispondenza Nessuna corrispondenza

/var

/var
/var/log
/usr/var

^/var

/var
/var/log

/usr/var

/var$

/var
/usr/var

/var/log

^/var$

/var

/var/log
/usr/var

Nel monitoraggio e nella Console degli Eventi, il match parziale è lo standard. Nel monitoraggio, il match parziale è lo standard. Vengono trovate le espressioni che compaiono in qualsiasi punto del testo, ovvero la ricerca di "memory" trova anche "kernel memory". Nella GUI di Setup, invece, quando si confrontano espressioni regolari con nomi dei servizi e altre cose, Checkmk controlla fondamentalmente se l'espressione corrisponde all'inizio del testo (match inizio parola (prefisso)) — questo è solitamente ciò che stai cercando:

regexes servicematch

Se hai bisogno di un match parziale in punti in cui è previsto il match inizio parola (prefisso), basta estendere l'espressione regolare con .* all'inizio per trovare qualsiasi stringa prefissata:

Espressione regolare Corrispondenza Nessuna corrispondenza

/var

/var
/var/log

/usr/var

.*/var

/var
/usr/var
/var/log

/var$

/var

/var/log
/usr/var

Suggerimento: puoi anteporre a qualsiasi ricerca all'inizio di una stringa ^ e a qualsiasi ricerca all'interno di una stringa .* , gli interpreti delle espressioni regolari ignoreranno i simboli ridondanti.

2.6. Mascherare i caratteri speciali con una barra rovesciata

Dato che il punto corrisponde a tutto, ovviamente corrisponde anche a un punto. Se ora vuoi trovare esattamente un punto, devi mascherarlo con una barra rovesciata (\). Questo vale in modo analogo per tutti gli altri caratteri speciali. Questi sono: \ . * + ? { } ( ) [ ] | & ^ e $. Scrivere una barra rovesciata \ fa sì che il carattere speciale che la segue venga trattato come un carattere normale:

Espressione regolare Corrispondenza Nessuna corrispondenza

example\.com

example.com

example\.com
example-com

How\?

How?

How\?
How

C:\\Programs

C:\Programs

C:Programs
C:\\Programs

Attenzione Python: poiché in Python la barra rovesciata nella rappresentazione interna della stringa viene mascherata internamente con un'altra barra rovesciata, queste due barre rovesciate devono essere mascherate nuovamente, il che porta a un totale di quattro barre rovesciate:

Espressione regolare Corrispondenza Nessuna corrispondenza

C:\\\\Programs

C:\Programs

C:Programs
C:\\Programs

2.7. Valori alternativi

Con la barra verticale | puoi definire delle alternative, ovvero usare un'operazione OR: 1|2|3corrisponde a 1, 2 o 3. Se hai bisogno di tali alternative nel mezzo di un'espressione, raggruppale tra parentesi tonde:

Espressione regolare Corrispondenza Nessuna corrispondenza

CPU load|Kernel|Memory

CPU load
Kernel

CPU utilization

01|02|1[1-5]



01 02 11 bis 15

05

2.8. Gruppi di corrispondenza

I gruppi di corrispondenza (o gruppi di cattura) svolgono due funzioni: La prima funzione è il raggruppamento di alternative o corrispondenze parziali, come mostrato nell'esempio precedente. Sono possibili anche raggruppamenti annidati. Inoltre, gli operatori di ripetizione *, +, ? e {…​} possono essere utilizzati preceduti da parentesi tonde. Pertanto, l'espressione (/local)?/share corrisponde sia a /local/share che a /share.

La seconda funzione è quella di "catturare" i gruppi di corrispondenza in variabili. Nella Console degli Eventi (EC), nella Business Intelligence (BI), nella ridenominazione massiva degli host e nelle mappature piggyback, c'è la possibilità di utilizzare la parte di testo corrispondente all'espressione regolare nella prima parentesi come \1 , la parte corrispondente alla seconda parentesi come \2 , e così via. L'ultimo esempio nella tabella mostra l'uso delle alternative all'interno di un gruppo di corrispondenza.

Espressione regolare Testo da corrispondere Gruppo 1 Gruppo 2

()([123])

def231

def

231

server-(.*)\.local

server-lnx02.local

lnx02

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

server.dmz.net

dmz

L'immagine seguente mostra come rinominare più host in un'unica operazione. Tutti i nomi host che corrispondono all'espressione regolare server-(.*)\.local verranno sostituiti con \1.servers.local. Dove \1 sta esattamente per il testo "catturato" dall'.*e tra parentesi:

bulk renaming regex

Nell'esempio concreto, server-lnx02.local viene quindi convertito in lnx02.servers.local.

Se un gruppo di corrispondenza non deve "catturare" gruppi di caratteri, ad esempio se viene utilizzato solo per strutturare, puoi usare ?: per convertirlo in un gruppo di corrispondenza non catturante (non-capturing match group): (?:/local)?/share.

2.9. Flag inline

Con i flag inline, è possibile effettuare impostazioni specifiche relative alla modalità di valutazione all'interno di un'espressione regolare. Il più rilevante per lavorare con Checkmk è (?i), che switcha alla corrispondenza insensibile alle maiuscole/minuscole per le espressioni che altrimenti sarebbero sensibili alle maiuscole/minuscole. In casi molto rari, potresti voler utilizzare anche (?s) e (?m) per lavorare con stringhe su più righe.

Tieni presente che dalla versione 3.11 Python si aspetta che i flag inline siano all'inizio di un'espressione regolare - (?i)somestring — oppure che specifichino l'ambito — (?i:somestring). Dato che Checkmk in alcuni casi combina internamente le espressioni regolari per migliorare la performance, ti consigliamo vivamente di non usare i flag inline all'inizio di un'espressione regolare. Usa invece sempre la notazione con l'ambito — che, in caso di dubbio, si estende all'intera espressione regolare:

(?i:somestring).

Questa è una variante del gruppo di corrispondenza senza cattura.

3. Tabella dei caratteri speciali

Qui troverai un elenco che riassume tutti i caratteri speciali e le funzioni delle espressioni regolari utilizzate da Checkmk, come spiegato sopra:

.

corrisponde a qualsiasi carattere.

`

Valuta il carattere speciale successivo come un carattere normale.

{5}

Il carattere precedente deve comparire esattamente cinque volte.

{5,10}

Il carattere precedente deve comparire almeno cinque e al massimo dieci volte.

*

Il carattere precedente può comparire un numero qualsiasi di volte (corrisponde a {0,}).

+

Il carattere precedente può comparire un numero qualsiasi di volte, ma deve comparire almeno una volta (equivalente a {1,}).

?

Il carattere precedente può comparire zero o una volta (equivalente a {0,1}).

[abc]

Rappresenta esattamente uno dei caratteri a , b o c.

[0-9]

Indica esattamente uno dei caratteri 0, 1 …​ 9 (cioè una cifra).

[0-9a-z_]

Indica esattamente una cifra, una lettera minuscola o il trattino basso.

[^"']

Indica un carattere come eccezione, eccetto la virgoletta singola o doppia.

$

Corrisponde alla fine di un testo.

^

Corrisponde all'inizio di un testo.

A|B|C

Corrisponde a A o B o C.

(A)

Corrisponde alla sottoespressione A a un gruppo di corrispondenza.

(?i:A)

Cambia la modalità di valutazione della sottoespressione A in insensibile alle maiuscole/minuscole tramite il flag inline.

\t

Corrisponde a un tabulatore. Questo carattere compare spesso nei file di log o nelle tabelle CSV.

\s

Corrisponde a tutti gli spazi (l'ASCII utilizza 5 diversi tipi di spazio).

I seguenti caratteri devono essere preceduti da una barra rovesciata, se devono essere usati letteralmente: \ . * + ? { } ( ) [ ] | & ^ $.

3.1. Unicode in Python 3

In particolare, se sono stati copiati e incollati nomi propri nei commenti o nei testi descrittivi, e quindi nel testo compaiono caratteri Unicode o diversi tipi di spazi, le classi estese di Python sono molto utili:

\t

Corrisponde a un tabulatore (tab), presente in parte nei file di log o nelle tabelle CSV.

\s

Corrisponde a tutti gli spazi (Unicode supporta 25 spazi diversi, ASCII 5).

\S

Inverte rispetto a \s, ovvero corrisponde a tutti i caratteri che non sono spazi.

\w

Corrisponde a tutti i caratteri che fanno parte di una parola, cioè lettere, e in Unicode anche accenti, glifi cinesi, arabi o coreani.
Attenzione: qui i numeri fanno parte della parola.

\W

Inversione di \w, ovvero corrisponde a tutto ciò che in genere non fa parte di una parola (spazi, segni di punteggiatura, emoticon, caratteri matematici speciali).

Nei casi in cui Checkmk consente di corrispondere con Unicode, l'\w è particolarmente utile quando si cercano parole con ortografia simile in lingue diverse, ad esempio nomi propri che a volte sono scritti con l'accento e a volte senza.

Espressione regolare Corrispondenza Nessuna corrispondenza

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

Schnitzel (Tedesco)
șnițel (Rumeno)

šnicl (Croato)
Schnit'el (con carattere di omissione)

4. Testare le espressioni regolari

La logica delle espressioni regolari non è sempre facile da capire, specialmente nel caso di gruppi di corrispondenza annidati, e quando si tratta di capire l'ordine e quale estremità della stringa deve essere abbinata. Meglio che procedere per tentativi in Checkmk, ci sono due modi per testare le espressioni regolari: Servizi online come regex101.com preparano le corrispondenze in modo grafico e spiegano l'ordine di valutazione in tempo reale:

regexes testing

La seconda procedura di test è il prompt di Python, che è incluso in ogni installazione di Python. Su Linux e Mac OS, Python 3 è solitamente preinstallato. Proprio perché le espressioni regolari al prompt di Python vengono valutate esattamente come in Checkmk, non ci sono discrepanze nell'interpretazione, anche in caso di nidificazioni complesse. Con il test nell'interprete Python vai sempre sul sicuro.

Dopo l'apertura, devi importare il modulo re. Nell'esempio switchiamo la distinzione tra maiuscole e minuscole con 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
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Per emulare il comportamento delle espressioni regolari di C, utilizzate anche in molti componenti Python, puoi limitarti all'ASCII:

>>> re.ASCII
re.ASCII

Ora puoi usare la funzione re.match() per confrontare direttamente un'espressione regolare con una stringa e visualizzare il gruppo di corrispondenza: group(0)indica l'intera corrispondenza, mentre group(1) indica la prima corrispondenza che corrisponde alla sottoespressione racchiusa tra parentesi tonde:

>>> 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. Documentazione esterna aggiuntiva

Ken Thompson, uno dei creatori di Unix negli anni '60, è stato il primo a sviluppare le espressioni regolari nella forma odierna, tra l'altro nel comando Unix grep, che è ancora in uso. Da allora sono state create numerose estensioni e dialetti delle espressioni regolari, tra cui le regex estese, le regex compatibili con Perl e una variante molto simile in Python.

Nei filtri delle visualizzazioni, Checkmk utilizza le espressioni regolari estese POSIX (extended REs). Queste vengono valutate nel nucleo di monitoraggio in C utilizzando la funzione regex della libreria C. Puoi trovare un riferimento completo al riguardo nella pagina di manuale Linux relativa a 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;
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

In tutti gli altri contesti sono disponibili tutte le funzioni delle espressioni regolari di Python. Ciò include, tra le altre cose, le regole di configurazione , le regole di configurazione della Console degli Eventi (EC) e la Business Intelligence (BI) .

Le espressioni regolari in Python sono un'estensione delle RE estese e sono molto simili a quelle di Perl. Supportano, ad esempio, il cosiddetto lookahead negativo, un asterisco non avido * o l'applicazione della distinzione tra maiuscole e minuscole. I dettagli sulle funzionalità di queste espressioni regolari sono disponibili nella guida online di Python per il modulo re o, in modo più approfondito, nella documentazione online di 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'.
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Una spiegazione molto dettagliata delle espressioni regolari è disponibile in un articolo di Wikipedia.


Last modified: Mon, 15 Dec 2025 13:54:09 GMT via commit 3e0be1a60
In questa pagina