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. 導入

正規表現(regex、またはまれにregexp)は、Checkmk でサービス名を指定するほか、さまざまな場面で使用されます。 これは、特定のテキストと一致する一致)または一致しない(不一致)パターンです。 このパターンを使用すると、名前に「foo 」または「bar 」を含むすべてのサービスに適用される柔軟なルールを作成するなど、さまざまな実用的な作業を行うことができます。

正規表現は、ファイル名検索パターンと混同されることがよくあります。これは、特殊文字の「* 」と「? 」、および角括弧と波括弧が両方に存在するためです。

この記事では、Checkmk のコンテキストで、正規表現の最も重要な機能をご紹介します。 Checkmk は正規表現に 2 つの異なるコンポーネントを使用しているため、細部に注意が必要な場合があります。 基本的に、監視コアはC ライブラリを使用し、その他のコンポーネントはPython 3 を使用しています。 違いがある場合は、その点についても説明します。

ヒント:Checkmk では、さまざまなページの入力フィールドで正規表現を使用できます。 不明な場合は、Help メニュー(Help > Show inline help )から状況依存ヘルプをご利用ください。 そこで、正規表現が許可されているかどうか、および使用方法を確認できます。

古いプラグインや外部ソースのプラグインを使用する場合、Python 2 または Perl を使用しており、ここで説明する規約と異なる場合があります。

この記事では、正規表現の最も重要な機能について説明しますが、すべてを網羅しているわけではありません。 ここで紹介されている機能では不十分な場合は、以下の 関連情報で詳細をご覧ください。 また、インターネットもご活用ください。

たとえば、正規表現を使用してログファイル内の異常を見つけるような独自のプラグインをプログラムする場合は、この記事を参考としてください。 ただし、大量のデータを検索する場合は、パフォーマンスの最適化が重要な要素となります。 疑問がある場合は、必ず使用している正規表現ライブラリのドキュメントを参照してください。

2. 正規表現の使用

このセクションでは、単一の文字や文字列の単純な一致から、複雑な文字のグループまで、正規表現の操作方法を具体的な例を使って説明します。

2.1. アルファベットと数字の文字

正規表現では、パターンが特定のテキスト(サービス名など)と一致するかどうかが常に問題になります。 最も単純な使用例は、英数字の文字列です。 これらは(ハイフンとして使用されるマイナス記号も)、式の中でそれ自体と一致します。

監視環境での検索では、Checkmk は通常、大文字と小文字を区別しません。 ほとんどの場合、式「CPU load 」は、テキスト「CPU load 」と「cpu LoAd 」の両方に一致します。 一方、設定環境での検索では、通常、大文字と小文字は区別されます。 この基準の正当な例外はあり、インラインヘルプで説明されています。

注意:正規表現を使用しない入力フィールドで完全一致が指定されている場合 (ほとんどの場合、ホスト名)、大文字と小文字は常に区別されます!

2.2. ポイント ( . ) としてのワイルドカード

プレーンテキストの文字列に加えて、いくつかの文字および文字列には「特別な」機能があります。 最も重要な文字は、. (ピリオド)です。 これは、任意の1文字と完全に一致します。

正規表現 一致 一致しません

Me.er

Meier
Meyer

Meyyer

.var.log

1var2log
/var/log

/var//log

2.3. 文字の繰り返し

特定の長さの文字列が複数回出現することを定義したい場合がよくあります。 この目的のため、前の文字の繰り返し回数を波括弧で指定します:

正規表現 関数 一致 一致しません

Ax{2,5}B

x 少なくとも2回以上、5回以下で出現します

AxxB
AxxxxB

AxB
AxxxxxxB

Ax{0,5}B

x 最大 5 回出現しますが、出現する必要はありません

AB
AxxxxxB

AxxxxxxB

Ax{3}B

x 正確に3回発生します

AxxxB

AxxB
AxxxxB

Ax{0,}B

x 任意の回数発生する可能性があります

AB
AxxxxxxB

Ax{1,}B

x 少なくとも1回発生します

AxB
AxxxxxB

AB

Ax{0,1}B

x 1回以下発生します

AB
AxB

AxxB

上記の最後の 3 つの条件には、それぞれ略語があります。* は、前の文字と任意の回数一致します。+ は、少なくとも 1 回一致します。?、最大 1 回一致します。

繰り返しオペレーターとピリオド . を組み合わせて、より明確な方法で任意の文字のシーケンスを検索することもできます。

正規表現 一致 一致しません

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. 文字クラス、数字、文字

文字クラスを使用すると、文字セットの特定のセクションを一致させることができます。たとえば、「ここに数字が入らなければならない」といった場合です。 これを行うには、一致させるすべての文字を角括弧で囲みます。マイナス記号を使用すると、範囲を指定することもできます。 注: 7 ビット ASCII 文字セットの順序が適用されます。

たとえば、[abc] は、a、b、c のいずれかの 1 文字を表し、[0-9]、任意の数字を表します。 また、全体を否定することも可能です。括弧内に^ を挿入すると、[^abc]、a、b、c 以外の任意の文字を表します。

文字クラスは、もちろん他のオペレーターと組み合わせることができます。 いくつかの抽象的な例から始めましょう。

文字クラス 関数

[abc]

a、b、c のいずれか1つ。

[0-9a-z_]

数字、小文字のアルファベット、またはアンダーバーのどれか1つ。

[^abc]

a、b、c 以外の任意の文字。

[ --]

ASCII規格に準拠した空白文字からハイフンまでの文字を1つだけ使用します。この範囲に含まれる文字は以下の通りです:!"#$%&'()*+,

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

任意の順序で、1文字以上20文字以下の文字と数字の組み合わせ。

以下の例をご参照ください:

正規表現 一致 一致しません

[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
(ここではコロン前のグループのみが一致します)

注: -[] のいずれかの文字が必要な場合は、トリックを使用する必要があります。 前の例で示したように、クラスの最後に - (マイナス記号)を記述します。 正規表現を評価する場合、マイナス記号は 3 文字の真ん中にない限り、演算子としてではなく、そのままその文字として評価されます。 必要に応じて、クラスの最初の文字として閉じ角括弧を、2 番目の文字として開き角括弧を挿入します。 空のクラスは許可されていないため、閉じ角括弧は通常の文字として解釈されます。 これらの特殊文字を含むクラスは次のように表示されます:[]-] 、または開き角括弧も必要な場合は[][-]

2.5. 開始と終了 — プレフィックス、サフィックス、インフィックス

多くの場合、文字列の先頭、末尾、または文字列内の任意の場所での一致を区別する必要があります。 文字列の先頭の一致 (プレフィックス一致) には、^ (サーカムフレックス) を使用し、末尾の一致 (サフィックス一致) には、$ (ドル記号) を使用します。 これらのオペレーターのいずれも指定されていない場合、ほとんどの正規表現ライブラリは、デフォルトとしてインフィックス一致を使用します。これは、文字列内のどこからでも検索されます。 完全一致の場合は、^$ の両方を使用してください。

正規表現 一致 一致なし

/var

/var
/var/log
/usr/var

^/var

/var
/var/log

/usr/var

/var$

/var
/usr/var

/var/log

^/var$

/var

/var/log
/usr/var

監視およびイベントコンソールでは、インフィックス一致が標準です。 監視では、インフィックス一致が標準です。 テキスト内のどこにでも出現する式が検索されます。つまり、「memory」を検索すると、「kernel memory」も検索されます。 一方、セットアップ GUI では、正規表現をサービス名などと比較する場合、Checkmk は基本的に、式がテキストの先頭と一致するかどうか(プレフィックス一致)をチェックします。これは通常、検索したい内容です。

regexes servicematch

プレフィックス一致が提供されている場所でインフィックス一致が必要な場合は、正規表現の先頭に.* を追加して、プレフィックス付き文字列に一致するように拡張してください。

正規表現 一致 一致しません

/var

/var
/var/log

/usr/var

.*/var

/var
/usr/var
/var/log

/var$

/var

/var/log
/usr/var

ヒント:文字列の先頭に検索を付ける場合は^ 、文字列内の検索を付ける場合は .* を付けることで、 正規表現インタプリタは冗長な記号を無視します。

2.6. バックスラッシュで特殊文字をマスク

ポイントはすべてに一致するため、当然、ポイントにも一致します。 ここで、1 つのポイントに正確に一致させたい場合は、\ (バックスラッシュ)でマスクする必要があります。 これは、他のすべての特殊文字にも同様に適用されます。 これらの特殊文字は、\ . * + ? { } ( ) [ ] | & ^ および$ です。\ バックスラッシュをコードすると、その後に続く特殊文字は通常の文字として扱われます。

正規表現 一致 一致しません

example\.com

example.com

example\.com
example-com

How\?

How?

How\?
How

C:\\Programs

C:\Programs

C:Programs
C:\\Programs

注意 Python: Pythonでは 内部文字列表現のバックスラッシュは、内部で別のバックスラッシュでマスクされるため、この 2 つのバックスラッシュは再度マスクする必要があります。 その結果、合計 4 つのバックスラッシュになります。

正規表現 一致 一致しません

C:\\\\Programs

C:\Programs

C:Programs
C:\\Programs

2.7. 代替値

縦線| を使用すると、代替値、つまり OR 演算を定義することができます。1|2|3 は 1、2、または 3 に一致します。 式の中央でこのような代替値が必要な場合は、丸括弧で囲んでグループ化してください。

正規表現 一致 一致しません

CPU load|Kernel|Memory

CPU load
Kernel

CPU utilization

01|02|1[1-5]

01
02
11 bis15

05

2.8. マッチグループ

マッチグループまたはキャプチャグループ)には 2 つの機能があります。 1 つ目の機能は、前の例で示したような、選択肢や部分一致のグループ化です。 ネストしたグループ化も可能です。 さらに、繰り返しオペレータ*+?{…​} を丸括弧で囲んで使用することができます。 したがって、式(/local)?/share は、/local/share/share の両方に一致します。

2 つ目の機能は、一致した文字グループを変数に「キャプチャ」することです。 イベント コンソール (EC)ビジネスインテリジェンス (BI)ホストの一括名前変更 およびピギーバックマッピングでは、最初の括弧内の正規表現に対応するテキスト部分を\1 、2 番目の括弧に対応する部分を\2 などとして使用することができます。 表の最後の例は、マッチグループ内での代替の使用を示しています。

正規表現 一致するテキスト グループ 1 グループ2

()([123])

def231

def

231

server-(.*)\.local

server-lnx02.local

lnx02

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

server.dmz.net

dmz

次の図は、1 つの操作で複数のホストの名前を変更した例です。 正規表現server-(.*)\.local に一致するすべてのホスト名は、\1.servers.local に置き換えられます。\1 は、括弧内の.* で「キャプチャ」されたテキストと完全に一致します。

bulk renaming regex

具体的な例では、server-lnx02.locallnx02.servers.local に変換されます。

文字グループを「キャプチャ」する必要がない場合、たとえば構造化のためにのみ使用する場合、?: を使用して、非キャプチャマッチグループ(非キャプチャマッチグループ)に変換することができます。(?:/local)?/share

2.9. インラインフラグ

インラインフラグを使用すると、正規表現内で評価モードに関する特定の設定を行うことができます。 Checkmk で作業する場合に最も関連するのは、(?i) で、これは、大文字と小文字を区別する式について、大文字と小文字を区別しない一致に切り替えます。 ごくまれに、複数行の文字列を扱うために、(?s) および(?m)を使用したい場合もあります。

バージョン 3.11 以降、Python は正規表現の先頭((?i)somestring)またはスコープを指定する((?i:somestring) )インラインフラグを期待することに注意してください。 Checkmk は、パフォーマンス向上のために内部で正規表現を結合する場合があるため、正規表現の先頭にインラインフラグを使用しないことを強くお勧めします。 代わりに、常に スコープを含む表記を使用してください。これは、疑わしい場合は正規表現全体に拡張されます。

(?i:somestring).

これは、非キャプチャマッチグループの変形です。

3. 特殊文字の一覧

ここでは、上記で説明した Checkmk で使用されるすべての特殊文字および正規表現関数をまとめたリストをご覧いただけます。

.

任意の文字と一致します。

`

次の特殊文字を通常の文字として評価します。

{5}

前の文字が正確に5回出現する必要があります。

{5,10}

前の文字が少なくとも5回、最大10回出現する必要があります。

*

前の文字は任意の回数出現可能です({0,} と同等です)。

+

前の文字は任意の回数出現できますが、少なくとも1回は出現する必要があります({1,} と同等です)。

?

前の文字は0回または1回出現できます({0,1} と同等です)。

[abc]

ab 、またはcの文字のうち、正確に1つを表します。

[0-9]

01 …​9 のいずれか1つを正確に表します(つまり、数字を表します)。

[0-9a-z_]

正確に1つの数字、小文字のアルファベット、またはアンダーバーを表します。

[^"']

単一または二重の逆引用符を除く、1 文字を正確に表します。

$

テキストの末尾と一致します。

^

テキストの先頭と一致します。

A|B|C

ABC に一致します。

(A)

サブ式A をマッチグループに一致します。

(?i:A)

サブ式Aの評価モードをインラインフラグを介して大文字小文字を区別しないモードに変更します。

\t

タブストップ (タブ) と一致します。この文字は、ログファイルや CSV テーブルでよく使用されます。

\s

すべてのスペースに一致します (ASCII では 5 種類のスペースが使用されます)。

以下の文字は、文字通り使用する場合は、バックスラッシュでマスクする必要があります。\ . * + ? { } ( ) [ ] | & ^ $

3.1. Python 3 の Unicode

特に、コメントや説明テキスト内の固有名詞をコピーして貼り付けた場合、テキストに Unicode 文字やさまざまな種類のスペースが含まれることがあります。このような場合、Python の拡張クラスが非常に役立ちます。

\t

ログファイルや CSV テーブルの一部で、タブストップ (タブ) に一致します。

\s

すべてのスペースに一致します (Unicode は 25 種類のスペース、ASCII は 5 種類をサポートしています)。

\S

\s を反転、つまり、スペース以外のすべての文字と一致します。

\w

単語の一部であるすべての文字、つまり文字、および Unicode ではアクセント、中国語、アラビア語、韓国語のグリフも一致します。
注意:ここでは数字も単語の一部です。

\W

\w の反転、つまり、通常単語の一部ではないものすべてに一致します (スペース、句読点、絵文字、特殊な数学記号)。

Checkmk が Unicode マッチングを許可している場所では、\w は、異なる言語でスペルが似ている単語、たとえばアクセント記号がある場合とない場合のある固有名詞を検索する場合に特に便利です。

正規表現 一致 一致なし

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

Schnitzel (ドイツ語)
șnițel (ルーマニア語)

šnicl (クロアチア語)
Schnit'el (省略文字付き)

4. 正規表現のテスト

正規表現のロジックは、特にネストされたマッチグループの場合、その順序や文字列のどの部分と一致させるかなど、必ずしも理解しやすいものではありません。 Checkmk で試行錯誤するよりも、正規表現をテストする 2 つの方法があります。 regex101.comなどのオンラインサービスでは、一致をグラフィカルに表示し、評価の順序をリアルタイムで説明します。

regexes testing

2 つ目のテスト手順は、Python のインストールに必ず付属する Python プロンプトを使用する方法です。 Linux および Mac OS では、通常 Python 3 がプリインストールされています。 Python プロンプトでの正規表現は Checkmk と同じように正確に評価されるため、複雑なネストがあっても解釈の相違は発生しません。 Python インタープリタでのテストを使用すれば、常に安全です。

開いたら、モジュールre をインポートする必要があります。 この例では、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

多くの Python コンポーネントでも使用されている C の正規表現の動作をエミュレートするには、ASCII に制限することができます。

>>> re.ASCII
re.ASCII

これで、re.match() 関数を使用して、正規表現を文字列と直接一致させ、マッチグループを出力することができます。group(0) は一致全体を表し、group(1) は丸括弧で囲まれた部分式と最初に一致した部分を表します。

>>> 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. 追加の外部ドキュメント

1960年代にUnixを開発した一人であるケン・トンプソンは、現在のフォームの正規表現を最初に開発しました。その一つは、現在も使用されているUnixコマンドgrep です。 それ以来、正規表現には、拡張正規表現、Perl互換の正規表現、Pythonの非常に類似した変形など、数多くの拡張や方言が作成されています。

ビューのフィルタでは、Checkmk はPOSIX 拡張正規表現(拡張 RE) を使用しています。 これらは、C ライブラリの regex 関数を使用して、C 言語で監視コアで評価されます。 この機能に関する完全なリファレンスは、Linux の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;

それ以外の場所では、Python の正規表現のすべての関数を使用できます。 これには、とりわけ 設定ルールイベントコンソール (EC) 設定ルール およびビジネスインテリジェンス (BI)

Python の正規表現は、拡張 RE の拡張機能であり、Perl の正規表現とよく似ています。 たとえば、いわゆるネガティブルックアヘッド、非貪欲な* アスタリスク、大文字と小文字の区別強制などをサポートしています。 これらの正規表現の機能の詳細については、re モジュールに関する Python オンラインヘルプ、または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'.

正規表現に関する非常に詳細な説明は、 Wikipediaの記事でご確認いただけます。

このページでは