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. Introducción

Las expresiones regulares —regex (o, en raras ocasiones, regexp)— se usan en Checkmk para especificar nombres de servicios y en muchas otras situaciones. Son patrones que producen coincidencias con un texto determinado o que no producen coincidencias (no producen coincidencias). Puedes hacer muchas cosas prácticas con ellas, como formular reglas flexibles que se apliquen a todos los servicios que tengan foo o bar en su nombre.

Las expresiones regulares se confunden a menudo con los patrones de búsqueda de nombres de archivo, ya que los caracteres especiales * y ?, así como los corchetes y las llaves, pueden aparecer en ambos.

En este artículo te mostraremos las funciones más importantes de las expresiones regulares, por supuesto en el contexto de Checkmk. Dado que Checkmk utiliza dos componentes diferentes para las expresiones regulares, a veces el diablo está en los detalles. Básicamente, el core de monitorización utiliza la biblioteca C y todos los demás componentes utilizan Python 3. Cuando haya diferencias, te las explicaremos.

Tip

En Checkmk, las expresiones regulares están permitidas en los campos de entrada de varias páginas. Si no estás seguro, utiliza la ayuda contextualizada a través del menú «Help» (Help > Show inline help). Allí podrás ver si se permiten las expresiones regulares y cómo se pueden utilizar.

Al trabajar con Plugins antiguos o de fuentes externas, puede ocurrir que estos utilicen Python 2 o Perl y se desvíen de las convenciones descritas aquí.

En este artículo te mostraremos las capacidades más importantes de las expresiones regulares, pero de ninguna manera todas ellas. Si las posibilidades que se muestran aquí no son suficientes, a continuación encontrarás referencias donde podrás leer todos los detalles relevantes. Y luego siempre está internet.

Si quieres programar tus propios Plugins que, por ejemplo, utilicen expresiones regulares para encontrar anomalías en archivos de registro, puedes usar este artículo como base. Sin embargo, al buscar en grandes volúmenes de datos, la optimización del rendimiento es un aspecto importante. En caso de duda, consulta siempre la documentación de la biblioteca de expresiones regulares que estés utilizando.

2. Trabajar con expresiones regulares

En esta sección usamos ejemplos concretos para mostrar cómo trabajar con expresiones regulares, desde simples coincidencias de caracteres o cadenas individuales hasta grupos complejos de caracteres.

2.1. Caracteres alfanuméricos

Con las expresiones regulares, siempre se trata de ver si un patrón coincide con un texto determinado (por ejemplo, el nombre del servicio). El ejemplo de aplicación más sencillo es una cadena de caracteres alfanuméricos. Estos (y el signo menos usado como guión) simplemente producen una coincidencia consigo mismos en una expresión.

Al buscar en el entorno de monitorización, Checkmk no suele distinguir entre mayúsculas y minúsculas. En la mayoría de los casos, la expresión CPU load tiene una coincidencia con el texto CPU load y con cpu LoAd. Por otro lado, las búsquedas en el entorno de configuración suelen distinguir entre mayúsculas y minúsculas. Es posible que haya excepciones justificadas a estas normas, que se describen en la ayuda en línea.

Tip

En los campos de entrada sin expresiones regulares en los que se especifica una concordancia exacta (sobre todo con nombres del host), ¡siempre se distingue entre mayúsculas y minúsculas!

2.2. El punto ( . ) como comodín

Además de las cadenas de caracteres de «texto sin formato», hay una serie de caracteres y cadenas de caracteres que tienen funciones «mágicas». El carácter más importante de este tipo es el punto (.). Realiza una coincidencia exacta con cualquier carácter arbitrario:

Expresión regular Coincidencia Sin coincidencia

Me.er

Meier
Meyer

Meyyer

.var.log

1var2log
/var/log

/var//log

2.3. Repetición de caracteres

A menudo te interesa definir que pueda aparecer una secuencia de caracteres de una longitud determinada. Para ello, se especifica el número de repeticiones del carácter anterior entre llaves:

Expresión regular Función Coincidencia No hay coincidencia

Ax{2,5}B

x aparece al menos dos veces, pero no más de cinco

AxxB
AxxxxB

AxB
AxxxxxxB

Ax{0,5}B

x aparece como mucho cinco veces, pero no tiene por qué aparecer

AB
AxxxxxB

AxxxxxxB

Ax{3}B

x aparece exactamente tres veces

AxxxB

AxxB
AxxxxB

Ax{0,}B

x puede aparecer cualquier número de veces

AB
AxxxxxxB

Ax{1,}B

x ocurre al menos una vez

AxB
AxxxxxB

AB

Ax{0,1}B

x ocurre como máximo una vez

AB
AxB

AxxB

Hay abreviaturas para las tres últimas condiciones anteriores: « *» produce una coincidencia con el carácter anterior cualquier número de veces, «+» produce una coincidencia con al menos una aparición y «?» produce una coincidencia con como mucho una aparición.

También puedes usar el punto . con los operadores de repetición para buscar una secuencia de caracteres arbitrarios de una forma más definida:

Expresión regular Coincidencia Sin coincidencia

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. Clases de caracteres, números y letras

Las clases de caracteres permiten que se realicen coincidencias en ciertas secciones del conjunto de caracteres, por ejemplo, «aquí debe ir un dígito». Para ello, coloca todos los caracteres que se deben coincidir entre corchetes. Con un signo menos también puedes especificar rangos. Nota: Se aplica la secuencia del conjunto de caracteres ASCII de 7 bits.

Por ejemplo, [abc] representa exactamente uno de los caracteres a, b o c, y [0-9] representa cualquier dígito; ambos se pueden combinar. También es posible la negación del conjunto: con un ^ entre paréntesis, [^abc] representa entonces cualquier carácter excepto a, b, c.

Por supuesto, las clases de caracteres se pueden combinar con otros operadores. Empecemos con algunos ejemplos abstractos:

Clase de caracteres Función

[abc]

Exactamente uno de los caracteres a, b, c.

[0-9a-z_]

Exactamente un dígito, una letra minúscula o un guión bajo.

[^abc]

Cualquier carácter excepto a, b, c.

[ --]

Exactamente un carácter, desde un espacio en blanco hasta un guión, conforme al estándar ASCII. Los siguientes caracteres están dentro de este rango: !"#$%&'()*+,

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

Una secuencia de al menos una y como máximo 20 letras y/o dígitos en cualquier orden.

Aquí tienes algunos ejemplos prácticos:

Expresión regular Coincidencia Sin coincidencia

[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
(aquí solo se realiza la coincidencia del grupo antes de los dos puntos)

Tip

Si necesitas uno de los caracteres -, [ o ], tendrás que usar un truco. Escribe el signo menos (-) al final de la clase, tal y como se ha mostrado en el ejemplo anterior. Al evaluar las expresiones regulares, el signo menos, si no se encuentra en medio de tres caracteres, no se evalúa como un operador, sino como ese mismo carácter. Si es necesario, inserta un corchete de cierre como primer carácter de la clase y un corchete de apertura como segundo carácter. Dado que no se permiten clases vacías, el corchete de cierre se interpreta entonces como un carácter normal. Una clase con estos caracteres especiales tendría este aspecto: []-], o respectivamente [][-] si también se necesita el corchete de apertura.

2.5. Principio y fin: prefijo, sufijo e infijo

En muchos casos es necesario distinguir entre coincidencias al principio, al final o simplemente en algún punto dentro de una cadena. Para una concordancia al principio de una cadena (concordancia de prefijo), usa el ^ (circunflejo); para el final (concordancia de sufijo), usa el $ (signo de dólar). Si no se especifica ninguno de estos operadores, la mayoría de las bibliotecas de expresiones regulares usan la concordancia infix como valor predeterminado: se busca en cualquier parte de la cadena de caracteres. Para concordancias exactas, usa tanto ^ como $.

Expresión regular Coincidencia Sin coincidencia

/var

/var
/var/log
/usr/var

^/var

/var
/var/log

/usr/var

/var$

/var
/usr/var

/var/log

^/var$

/var

/var/log
/usr/var

En la monitorización y en la Consola de eventos, la concordancia infix es el estándar. En la monitorización, la concordancia infix es el estándar. Se encuentran las expresiones que aparecen en cualquier parte del texto, es decir, la búsqueda de «memory» también encuentra «kernel memory». En la GUI de configuración, por otro lado, al comparar expresiones regulares con nombres de servicios y otras cosas, Checkmk básicamente comprueba si la expresión coincide con el principio del texto (concordancia de prefijo); esto es normalmente lo que buscas:

regexes servicematch

Si necesitas una concordancia infix en lugares donde se ofrece la concordancia de prefijo, simplemente amplía tu expresión regular con .* al principio para que coincida con cualquier cadena prefijada:

Expresión regular Coincidencia Sin coincidencia

/var

/var
/var/log

/usr/var

.*/var

/var
/usr/var
/var/log

/var$

/var

/var/log
/usr/var

Consejo: Puedes anteponer «^» al inicio de una cadena y «.*» dentro de una cadena, los intérpretes de expresiones regulares ignorarán los símbolos redundantes.

2.6. Enmascarar caracteres especiales con una barra invertida

Dado que el punto coincide con todo, naturalmente también coincide con un punto. Si ahora quieres que coincida exactamente con un punto, tienes que enmascararlo con una barra invertida (\). Esto se aplica de forma análoga a todos los demás caracteres especiales. Estos son: \ . * + ? { } ( ) [ ] | & ^ y $. Al escribir una barra invertida \, el carácter especial que le sigue se trata como un carácter normal:

Expresión regular Coincidencia Sin coincidencia

example\.com

example.com

example\.com
example-com

How\?

How?

How\?
How

C:\\Programs

C:\Programs

C:Programs
C:\\Programs

Atención, Python: dado que en Python la barra invertida en la representación interna de la cadena se enmascara internamente con otra barra invertida, estas dos barras invertidas deben enmascararse de nuevo, lo que da un total de cuatro barras invertidas:

Expresión regular Coincidencia No hay coincidencia

C:\\\\Programs

C:\Programs

C:Programs
C:\\Programs

2.7. Valores alternativos

Con la barra vertical | puedes definir alternativas, es decir, usar una operación OR: 1|2|3coincide con 1, 2 o 3. Si necesitas esas alternativas en medio de una expresión, agrúpalas entre paréntesis:

Expresión regular Coincidencia No hay coincidencia

CPU load|Kernel|Memory

CPU load
Kernel

CPU utilization

01|02|1[1-5]



01 02 11 bis 15

05

2.8. Grupos de concordancia

Los grupos de concordancia (o grupos de captura) cumplen dos funciones: La primera función es agrupar alternativas o coincidencias parciales, como se muestra en el ejemplo anterior. También es posible anidar grupos. Además, se pueden usar los operadores de repetición *, +, ? y {…​} precedidos de paréntesis. Así, la expresión (/local)?/share coincide tanto con /local/share como con /share.

La segunda función es «capturar» los grupos de concordancia en variables. En la Consola de eventos (EC), en Business Intelligence (BI), en el renombramiento masivo de hosts y en los mapeos piggyback, existe la posibilidad de utilizar la parte de texto correspondiente a la expresión regular del primer paréntesis como \1 , la parte correspondiente al segundo paréntesis como \2 , y así sucesivamente. El último ejemplo de la tabla muestra el uso de alternativas dentro de un grupo de concordancia.

Expresión regular Texto de coincidencia Grupo 1 Grupo 2

()([123])

def231

def

231

server-(.*)\.local

server-lnx02.local

lnx02

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

server.dmz.net

dmz

La siguiente imagen muestra cómo renombrar varios hosts de una sola vez. Todos los nombres del host que tengan una coincidencia con la expresión regular server-(.*)\.local se sustituirán por \1.servers.local. Donde \1 representa exactamente el texto «capturado» por .* entre paréntesis:

bulk renaming regex

En el ejemplo concreto, server-lnx02.local se convierte así en lnx02.servers.local.

Si no es necesario que un grupo de concordancia «capture» grupos de caracteres, por ejemplo, si solo se utiliza para estructurar, se puede usar ?: para convertirlo en un grupo de concordancia sin captura (grupo de concordancia sin captura): (?:/local)?/share.

2.9. Indicadores en línea

Con los indicadores en línea, se pueden establecer configuraciones específicas relativas al modo de evaluación dentro de una expresión regular. El más relevante para trabajar con Checkmk es (?i), que switcha a la coincidencia sin distinción de mayúsculas y minúsculas para expresiones que, de otro modo, serían sensibles a las mayúsculas y minúsculas. En casos muy raros, también querrás usar (?s) y (?m) para trabajar con cadenas de varias líneas.

Ten en cuenta que, desde la versión 3.11, Python espera que los indicadores en línea se coloquen al principio de una expresión regular —(?i)somestring— o que especifiquen el ámbito —(?i:somestring). Dado que Checkmk, en algunos casos, combina expresiones regulares internamente para mejorar el rendimiento, te recomendamos encarecidamente que no uses indicadores en línea al principio de una expresión regular. En su lugar, usa siempre la notación con ámbito —que, en caso de duda, se extiende a toda la expresión regular:

(?i:somestring).

Esta es una variante del grupo de concordancia sin captura.

3. Tabla de caracteres especiales

Aquí encontrarás una lista que resume todos los caracteres especiales y las funciones de expresiones regulares que usa Checkmk, tal y como se ha explicado anteriormente:

.

realiza coincidencias con cualquier carácter.

`

Interpreta el siguiente carácter especial como un carácter normal.

{5}

El carácter anterior debe aparecer exactamente cinco veces.

{5,10}

El carácter anterior debe aparecer al menos cinco y como máximo diez veces.

*

El carácter anterior puede aparecer cualquier número de veces (equivale a {0,}).

+

El carácter anterior puede aparecer cualquier número de veces, pero debe aparecer al menos una vez (equivalente a {1,}).

?

El carácter anterior puede aparecer cero o una vez (equivalente a {0,1}).

[abc]

Representa exactamente uno de los caracteres a, b o c.

[0-9]

Representa exactamente uno de los caracteres 0, 1 …​ 9 (es decir, un dígito).

[0-9a-z_]

Representa exactamente un dígito, una letra minúscula o el guión bajo.

[^"']

Representa exactamente un carácter, con excepción de la comilla simple o doble.

$

Coincidencia con el final de un texto.

^

Coincidencia con el principio de un texto.

A|B|C

Hay una coincidencia con A o B o C.

(A)

Coincide con la subexpresión A en un grupo de concordancia.

(?i:A)

Cambia el modo de evaluación de la subexpresión A a «sin distinción entre mayúsculas y minúsculas» mediante el indicador inline.

\t

Coincidencia con una tabulación. Este carácter suele aparecer en archivos de registro o tablas CSV.

\s

Realiza coincidencias con todos los espacios (ASCII utiliza 5 tipos diferentes de espacio).

Los siguientes caracteres deben ir precedidos de una barra invertida, si se quieren usar literalmente: \ . * + ? { } ( ) [ ] | & ^ $.

3.1. Unicode in Python 3

En particular, si se han copiado y pegado nombres propios en comentarios o textos descriptivos, y por lo tanto aparecen caracteres Unicode o diferentes tipos de espacios en el texto, las clases extendidas de Python son muy útiles:

\t

Coincidencia con una tabulación (tabulador), que se encuentra en parte en archivos de registro o tablas CSV.

\s

Realiza coincidencias con todos los espacios (Unicode admite 25 espacios diferentes, ASCII 5).

\S

Invertir desde \s, es decir, produce coincidencias para todos los caracteres que no sean espacios.

\w

Realiza coincidencias con todos los caracteres que forman parte de una palabra, es decir, letras, y en Unicode también acentos, glifos chinos, árabes o coreanos.
Atención: aquí los números forman parte de la palabra.

\W

Inversión de «\w», es decir, hay una coincidencia para todo lo que normalmente no forma parte de una palabra (espacios, signos de puntuación, emoticonos, caracteres matemáticos especiales).

En los casos en los que Checkmk permite la coincidencia Unicode, «\w» resulta especialmente útil a la hora de buscar palabras con ortografía similar en diferentes idiomas, por ejemplo, nombres propios que a veces se escriben con acento y otras sin él.

Expresión regular Coincidencia Sin coincidencia

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

Schnitzel (alemán)
șnițel (rumano)

šnicl (Croata)
Schnit'el (con carácter de omisión)

4. Probar expresiones regulares

La lógica de las expresiones regulares no siempre es fácil de entender, sobre todo cuando hay grupos de concordancia anidados, y surge la duda sobre el orden y qué extremo de la cadena se va a comparar. En lugar de ir probando a ciegas en Checkmk, hay dos formas de probar expresiones regulares: Los servicios online como regex101.com muestran las coincidencias de forma gráfica y explican el orden de evaluación en tiempo real:

regexes testing

El segundo método de prueba es el intérprete de Python, que viene con todas las instalaciones de Python. En Linux y Mac OS, Python 3 suele venir preinstalado. Precisamente porque las expresiones regulares en el intérprete de Python se evalúan exactamente igual que en Checkmk, no hay discrepancias en la interpretación, ni siquiera con anidamientos complejos. Con la prueba en el intérprete de Python siempre vas sobre seguro.

Una vez abierto, tienes que importar el módulo re. En el ejemplo switchamos la distinción entre mayúsculas y minúsculas 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
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

Para emular el comportamiento de las expresiones regulares de C, que también se usan en muchos componentes de Python, puedes restringir el uso a ASCII:

>>> re.ASCII
re.ASCII

Ahora puedes usar la función re.match() para comparar directamente una expresión regular con una cadena y mostrar el grupo de concordancia: group(0)representa la coincidencia completa, y group(1) la coincidencia que es la primera que coincide con la subexpresión entre paréntesis:

>>> 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. Documentación externa adicional

Ken Thompson, uno de los creadores de Unix allá por los años 60, fue el primero en desarrollar las expresiones regulares tal y como las conocemos hoy en día, entre otras cosas en el comando de Unix `grep`, que todavía se usa. Desde entonces, se han creado numerosas extensiones y dialectos de expresiones regulares, incluyendo expresiones regulares extendidas, expresiones regulares compatibles con Perl, así como una variante muy similar en Python.

En los filtros de las vistas de tabla, Checkmk utiliza expresiones regulares extendidas POSIX (RE extendidas). Estas se evalúan en el core de monitorización en C utilizando la función regex de la biblioteca C. Puedes encontrar una referencia completa al respecto en la página del manual de Linux para 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;
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

En todos los demás lugares, están disponibles todas las funciones de las expresiones regulares de Python. Esto incluye, entre otras cosas, las reglas de configuración , las reglas de configuración de la Consola de eventos (EC) y la Business Intelligence (BI) .

Las expresiones regulares en Python son una extensión de las expresiones regulares extendidas y son muy similares a las de Perl. Admiten, por ejemplo, la llamada «búsqueda negativa», un asterisco no codicioso de * o la distinción entre mayúsculas y minúsculas. Los detalles de las capacidades de estas expresiones regulares se pueden encontrar en la ayuda en línea de Python para el módulo re, o con más detalle en la documentación en línea 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'.
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

Puedes encontrar una explicación muy detallada de las expresiones regulares en un artículo de Wikipedia.


Last modified: Mon, 15 Dec 2025 13:54:09 GMT via commit 3e0be1a60
En esta página