[comment]: # attributes: notoc

[comment]: # ({09129833-0458cee0})
# 1 マクロ関数

#### 概要

マクロ関数は、[マクロ](/manual/config/macros)の値をカスタマイズする機能を提供します（例えば、特定の部分文字列を短縮または抽出するなど）。これにより、マクロの扱いが容易になります。

マクロ関数の構文は以下の通りです。

```default
{macro.func(params)}
```

ここで

-   **macro** - カスタマイズするマクロ
-   **func** - 適用する関数（[サポートされている関数](#supported-functions)を参照）
-   **params** - 関数パラメータのカンマ区切りリスト。以下の場合は**ダブルクォート**で囲む必要があります。
    -   先頭がスペースまたはダブルクォートで始まる場合
    -   閉じ括弧またはカンマを含む場合

例：

```default
{{TIME}.fmttime(format,time_shift)}
{{ITEM.VALUE}.regsub(pattern, output)}
{{$USERMACRO}.regsub(pattern, output)}
{{#LLDMACRO}.regsub(pattern, output)}
```

マクロ関数は以下でサポートされています。

-   [組み込みマクロ](/manual/appendix/macros/supported_by_location)
-   [ユーザーマクロ](/manual/appendix/macros/supported_by_location#other-macro-types)
-   [ローレベルディスカバリーマクロ](/manual/appendix/macros/supported_by_location#other-macro-types)
-   [式マクロ](/manual/appendix/macros/supported_by_location#other-macro-types)

マクロ関数は、上記のマクロがサポートされているすべての場所で使用できます。
これは、明示的にマクロのみが期待されると記載されている場合（例えば、[ホストマクロ](/manual/config/hosts/host#configuration)やローレベルディスカバリールールの[フィルター](/manual/discovery/low_level_discovery#filter)を設定する場合）を除きます。

1つのマクロにつき1つの関数のみサポートされており、複数のマクロ関数を連鎖して使用することはできません。

:::noteclassic
マクロ関数が他のコンテキスト（関数、アイテムキー、別のマクロなど）内で使用される場合のエスケープ例については、[エスケープ例](/manual/appendix/escaping)を参照してください。
:::

[comment]: # ({/09129833-0458cee0})

[comment]: # ({7283f95a-b8563887})
#### サポートされる関数

関数は追加情報なしで一覧表示されています。
関数をクリックすると、詳細を表示できます。

|Function|Description|
|--|--------|
|[btoa](#btoa)|マクロ値をBase64エンコードに変換します。|
|[fmtnum](#fmtnum)|小数点以下の桁数を制御するための数値書式設定。|
|[fmttime](#fmttime)|時刻の書式設定。|
|[htmldecode](#htmldecode)|マクロ値をHTMLエンコードからデコードします。|
|[htmlencode](#htmlencode)|マクロ値をHTMLエンコードに変換します。|
|[iregsub](#iregsub)|正規表現の一致による部分文字列の抽出（大文字小文字を区別しない）。|
|[lowercase](#lowercase)|マクロ値の文字を小文字に変換します。|
|[regrepl](#regrepl)|マクロ値内の文字/部分文字列を置換します。|
|[regsub](#regsub)|正規表現の一致による部分文字列の抽出（大文字小文字を区別する）。|
|[tr](#tr)|マクロ値の文字を翻字します。|
|[uppercase](#uppercase)|マクロ値の文字を大文字に変換します。|
|[urldecode](#urldecode)|マクロ値をURLエンコードからデコードします。|
|[urlencode](#urlencode)|マクロ値をURLエンコードに変換します。|

[comment]: # ({/7283f95a-b8563887})

[comment]: # ({91058888-c1632a9e})
#### 関数の詳細

オプションの関数パラメータは < > で示されます。

[comment]: # ({/91058888-c1632a9e})

[comment]: # ({d8d5fafe-6e2e93df})
##### btoa {#btoa}

マクロ値をBase64エンコーディングにエンコードします。
Base64エンコーディングは、バイナリデータをテキストとして表現する方法であり、テキストベースのプロトコルでバイナリコンテンツを保存および安全に転送するのに便利です。

例:

```default
{{ITEM.VALUE}.btoa()} - "zabbix"のような値をBase64で"emFiYml4"にエンコードします
```

[comment]: # ({/d8d5fafe-6e2e93df})

[comment]: # ({31245134-4df3fd19})
##### fmtnum(digits) {#fmtnum}

小数点以下の桁数を制御するための数値フォーマット。

パラメータ:

-   **digits** - 小数点以下の桁数。
有効範囲: 0-20。
末尾のゼロは出力されません。

例:

```default
{{ITEM.VALUE}.fmtnum(2)} - 受信値 "24.3483523" から "24.35" を返します
{{ITEM.VALUE}.fmtnum(0)} - 受信値 "24.3483523" から "24" を返します
```

[comment]: # ({/31245134-4df3fd19})

[comment]: # ({a8d94ee5-3caa4dc7})
##### fmttime(format,<time\_shift>) {#fmttime}

時刻の書式設定。<br>
この関数は、以下のいずれかの時刻形式の値に展開されるマクロで使用できることに注意してください。

-   `hh:mm:ss`
-   `yyyy-mm-ddThh:mm:ss[tz]`（ISO8601標準）
-   UNIXタイムスタンプ

パラメータ:

-   **format** - 必須の書式文字列。`strftime` 関数の書式設定と互換性があります。
-   **time\_shift**（オプション）- 書式設定の前に時刻へ適用される時間シフト。`-<N><time_unit>` または `+<N><time_unit>` で始まる必要があります。ここで:
    -   `N` - 加算または減算する時間単位の数。
    -   `time_unit` - h（時間）、d（日）、w（週）、M（月）、または y（年）。

コメント:

-   `time_shift` パラメータは複数段階の時間操作をサポートしており、時間単位の先頭へ移動するための `/<time_unit>` を含めることができます
    （`/d` - 深夜0時、`/w` - 週の1日目（月曜日）、`/M` - 月の1日目、など）。
    例: `-1w` - ちょうど7日前、`-1w/w` - 前週の月曜日、`-1w/w+1d` - 前週の火曜日。
-   時間操作は優先順位なしで左から右に計算されます。
たとえば、`-1M/d+1h/w` は `((-1M/d)+1h)/w` として解析されます。

例:

```default
{{TIMESTAMP}.fmttime(%B)} - 受信した値 "1633098961" から "October" を返します
{{TIMESTAMP}.fmttime(%d %B,-1M/M)} - 受信した値 "1633098961" から "1 September" を返します
```

[comment]: # ({/a8d94ee5-3caa4dc7})

[comment]: # ({d224cb43-e5cb24ab})
##### htmldecode {#htmldecode}

マクロ値をHTMLエンコードからデコードします。

以下の文字がサポートされています:

|値|デコード後の値|
|----|------|
|`&amp;`|`&`|
|`&lt;`|`<`|
|`&gt;`|`>`|
|`&quot;`|`"`|
|`&#039;`|`'`|
|`&#39;`|`'`|

例:

```default
{{ITEM.VALUE}.htmldecode()} - "&lt;"のような値をHTMLデコードして"<"にします
```

[comment]: # ({/d224cb43-e5cb24ab})

[comment]: # ({f78164e5-b0e6d63f})
##### htmlencode {#htmlencode}

マクロ値をHTMLエンコーディングに変換します。

以下の文字がサポートされています:

|値|エンコード値|
|----|------|
|`&`|`&amp;`|
|`<`|`&lt;`|
|`>`|`&gt;`|
|`"`|`&quot;`|
|`'`|`&#39;`|

例:

```default
{{ITEM.VALUE}.htmlencode()} - "<" のような文字を "&lt;" にHTMLエンコードします
```

[comment]: # ({/f78164e5-b0e6d63f})

[comment]: # ({edaa6df7-e78b5abd})
##### iregsub(pattern,output) {#iregsub}

正規表現(大文字・小文字を区別しない)による部分文字列の抽出。

パラメータ:

-   **pattern** - マッチさせる正規表現
-   **output** - 出力オプション。
**\\1 - \\9** プレースホルダーはキャプチャグループに対応。
**\\0** はマッチしたテキストを返します。

コメント:

-   正規表現にマッチしない場合、関数は空文字列を返します。
-   関数パターンが不正な正規表現の場合、マクロは「UNKNOWN」と評価されます(ただし、ローレベルディスカバリーマクロの場合は関数が無視され、マクロは未解決のままになります)。
-   置換文字列内で存在しないキャプチャグループへの参照は空文字列に置き換えられます。

例:

```default
{{ITEM.VALUE}.iregsub("fail|error|fault|problem","ERROR")} - "fail"、"error"、"fault"、"problem"のいずれかの部分文字列が受信された場合(大文字・小文字を区別しない)は"ERROR"に解決されます。マッチしない場合は空文字列を返します
```

[comment]: # ({/edaa6df7-e78b5abd})

[comment]: # ({9186768b-b7de9b23})
##### lowercase {#lowercase}

すべてのマクロ値の文字を小文字に変換します。
シングルバイト文字セット（ASCIIなど）で動作し、UTF-8はサポートしていません。

例:

```default
{{ITEM.VALUE}.lowercase()} - "Zabbix SERVER"のような値を"zabbix server"（小文字）に変換します
```

[comment]: # ({/9186768b-b7de9b23})

[comment]: # ({2064b2f8-2d4d3410})
##### regrepl(pattern,replacement,<pattern2>,<replacement2>,...) {#regrepl}

マクロ値内の文字または部分文字列の置換。

パラメータ:

-   **pattern** - マッチさせる正規表現
-   **replacement** - 置換する文字列
**\\1 - \\9** のプレースホルダーは、置換文字列内でキャプチャグループとしてサポートされています。

コメント:

-   パターンと置換は順番に処理され、各ペアは前の置換の結果に従って適用されます。
-   置換文字列内で存在しないキャプチャグループへの参照は、空文字列に置き換えられます。

例:

```default
{{ITEM.VALUE}.regrepl("oldParam", "newParam")} - "oldParam" を "newParam" に置換します
{{ITEM.VALUE}.regrepl("([^a-z])","\\\1")} - 英字以外のすべての文字をバックスラッシュでエスケープします
{$THRESHOLD:"{{#FSNAME}.regrepl(\"\\$\",\"\")}"} - 末尾のバックスラッシュを削除します（例: "C:\" を "C:" に置換）
{{ITEM.VALUE}.regrepl("_v1\.0", "_v2.0", "\(final\)", "")} - アイテム値内の複数の部分を置換します
```

[comment]: # ({/2064b2f8-2d4d3410})

[comment]: # ({825c2e80-a8dcf3b5})
##### regsub(pattern,output) {#regsub}

正規表現マッチによる部分文字列の抽出（大文字と小文字を区別）。

パラメータ:

-   **pattern** - マッチさせる正規表現
-   **output** - 出力オプション。
**\\1 - \\9** プレースホルダーはキャプチャグループに対応。
**\\0** はマッチしたテキストを返します。

コメント:

-   正規表現にマッチしない場合、関数は空文字列を返します。
-   関数パターンが不正な正規表現の場合、マクロは 'UNKNOWN' に評価されます（ただし、ローレベルディスカバリーマクロの場合は関数が無視され、マクロは未解決のままになります）。
-   置換文字列で存在しないキャプチャグループへの参照は、空文字列に置き換えられます。

例:

```default
{{ITEM.VALUE}.regsub("^([0-9]+)", Problem ID: \1)} - "123 Log line" のような値を受信した場合、"Problem ID: 123" に解決されます
{{ITEM.VALUE}.regsub("fail|error|fault|problem","ERROR")} - "fail"、"error"、"fault"、"problem" のいずれかの部分文字列を受信した場合（大文字と小文字を区別）、"ERROR" に解決されます。マッチしない場合は空文字列を返します
```

[追加の例](#additional-examples)も参照してください。

[comment]: # ({/825c2e80-a8dcf3b5})

[comment]: # ({40e84cc5-d7660986})
##### tr(characters,replacement) {#tr}

マクロ値の文字の音訳。

-   **characters** - 置換する文字のセット
-   **replacement** - 位置的に対応する置換文字のセット

例:

```default
{{ITEM.VALUE}.tr(abc, xyz)} - "a"を"x"、"b"を"y"、"c"を"z"にすべて置換します
{{ITEM.VALUE}.tr(abc, xyzq)} - "a"を"x"、"b"を"y"、"c"を"z"にすべて置換します（"q"は無視されます）
{{ITEM.VALUE}.tr(abcde, xyz)} - "a"を"x"、"b"を"y"、"c"を"z"、"d"を"z"、"e"を"z"にすべて置換します（つまりxyzzz）
{{ITEM.VALUE}.tr("\\\'", "\/\"")} - バックスラッシュをスラッシュに、シングルクォートをダブルクォートにすべて置換します
{{ITEM.VALUE}.tr(A-Z,a-z)} - すべての文字を小文字に変換します
{{ITEM.VALUE}.tr(0-9a-z,*)} - すべての数字と小文字を"*"に置換します
{{ITEM.VALUE}.tr(0-9,ab)} - 0を"a"に、1,2,3,4,5,6,7,8,9を"b"にすべて置換します
{{ITEM.VALUE}.tr(0-9abcA-L,*)} - すべての数字、"abc"文字、A-L範囲を"*"に置換します
{{ITEM.VALUE}.tr("\n","*")} - 行末を*に置換します
{{ITEM.VALUE}.tr("e", "\n")} - すべての"e"を行末に置換します
```

リテラル文字を含めるには:

```default
バックスラッシュ - \\でエスケープする必要があります
シングルクォート - \'でエスケープする必要があります
ダブルクォート - \"でエスケープする必要があります
```

バックスラッシュによるサポートされるエスケープシーケンス:

```default
\\\\ => \\ - ダブルバックスラッシュをシングルバックスラッシュに
\\a  => \a - アラート
\\b  => \b - バックスペース
\\f  => \f - フォームフィード
\\n  => \n - 改行
\\r  => \r - リターン
\\t  => \t - 水平タブ
\\v  => \v - 垂直タブ
```

[comment]: # ({/40e84cc5-d7660986})

[comment]: # ({57ab4e3a-8315e479})
##### uppercase {#uppercase}

すべてのマクロ値の文字を大文字に変換します。
シングルバイト文字セット(ASCIIなど)で動作し、UTF-8はサポートしていません。

例:

```default
{{ITEM.VALUE}.uppercase()} - "Zabbix Server"のような値を"ZABBIX SERVER"(大文字)に変換します
```

[comment]: # ({/57ab4e3a-8315e479})

[comment]: # ({9f54b4cb-15465392})
##### urldecode {#urldecode}

マクロ値をURLエンコードからデコードします。

例:

```default
{{ITEM.VALUE}.urldecode()} - "%2F"のような値を"/"にURLデコードします
```

[comment]: # ({/9f54b4cb-15465392})

[comment]: # ({725aedc6-362f6ccf})
##### urlencode {#urlencode}

マクロ値をURLエンコーディングに変換します。

例:

```default
{{ITEM.VALUE}.urlencode()} - "/"のような文字を"%2F"にURLエンコードします
```

[comment]: # ({/725aedc6-362f6ccf})

[comment]: # ({a95b22c2-148bfc16})
#### 追加例

以下の表は、マクロ関数の使用例をさらに示しています。

:::noteinfo
`{#IFALIAS}`は[LLDマクロ](/manual/config/macros/lld_macros)であり、低レベルディスカバリのコンテキスト（ディスカバリルール、プロトタイプ、およびそれらから作成されたアイテム/トリガー）でのみ定義されます。
LLD以外で使用すると、トークンは展開されません。
:::

|マクロ関数|受信値|出力|
|-------------|----|-------------|
|`{{ITEM.VALUE}.regsub(^[0-9]+, Problem)}`|`123Log line`|`Problem`|
|`{{ITEM.VALUE}.regsub("^([0-9]+)", "Problem")}`|`123 Log line`|`Problem`|
|`{{ITEM.VALUE}.regsub(".*", "Problem ID: \1")}`|`Log line`|`Problem ID: `|
|`{{ITEM.VALUE}.regsub("^(\w+).*?([0-9]+)", " Problem ID: \1_\2 ")}`|`MySQL crashed errno 123`|` Problem ID: MySQL_123 `|
|`{{ITEM.VALUE}.regsub("([1-9]+", "Problem ID: \1")}`|`123 Log line`|`*UNKNOWN*`（無効な正規表現）|
|`{{#IFALIAS}.regsub("(.*)_([0-9]+)", \1)}`|`customername_1`|`customername`|
|`{{#IFALIAS}.regsub("(.*)_([0-9]+)", \2)}`|`customername_1`|`1`|
|`{{#IFALIAS}.regsub("(.*)_([0-9]+", \1)}`|`customername_1`|`{{#IFALIAS}.regsub("(.*)_([0-9]+", \1)}`（無効な正規表現）|
|`{$MACRO:"{{#IFALIAS}.regsub(\"(.*)_([0-9]+)\", \1)}"}`|`customername_1`|`{$MACRO:"customername"}`|
|`{$MACRO:"{{#IFALIAS}.regsub(\"(.*)_([0-9]+)\", \2)}"}`|`customername_1`|`{$MACRO:"1"}`|
|`{$MACRO:"{{#IFALIAS}.regsub(\"(.*)_([0-9]+\", \1)}"}`|`customername_1`|`{$MACRO:"{{#IFALIAS}.regsub(\"(.*)_([0-9]+\", \1)}"}`（無効な正規表現）|
|`"{$MACRO:"\{{#IFALIAS}.regsub("(.*)_([0-9]+)", \1)}\"}"`|`customername_1`|`"{$MACRO:"\customername\"}"`|
|`"{$MACRO:"\{{#IFALIAS}.regsub("(.*)_([0-9]+)", \2)}\"}"`|`customername_1`|`"{$MACRO:"\1\"}"`|
|`"{$MACRO:\"{{#IFALIAS}.regsub(\\"(.*)_([0-9]+\\", \1)}\"}"`|`customername_1`|`"{$MACRO:\"{{#IFALIAS}.regsub(\\"(.*)_([0-9]+\\", \1)}\"}"`（無効な正規表現）|

##### アイテム値全体の表示

テキスト/ログアイテムの解決された{ITEM.VALUE}および{ITEM.LASTVALUE}マクロの長い値は、一部のフロントエンドの場所で20文字に切り捨てられます。
これらのマクロの完全な値を表示するには、以下のようなマクロ関数を使用できます。

```default
{{ITEM.VALUE}.regsub("(.*)", \1)}
{{ITEM.LASTVALUE}.regsub("(.*)", \1)}
```

詳細は、{ITEM.VALUE}および{ITEM.LASTVALUE}の[マクロ詳細](/manual/appendix/macros/supported_by_location)も参照してください。

[comment]: # ({/a95b22c2-148bfc16})


