このトピックでは、命令を使用して半構造化データを抽出する方法と、関連する例について説明します。
parse-regexp
正規表現グループに一致する指定されたフィールドから情報を抽出します。
構文
| parse-regexp <field>, <pattern> as <output>, ...パラメーター
パラメーター | 型 | 必須 | 説明 |
field | フィールド | はい | 抽出するソースフィールドの名前。 入力データには、このフィールドが含まれている必要があります。フィールドは |
pattern | 正規表現 | はい | 正規表現。RE2 構文がサポートされています。 |
output | フィールド | いいえ | 抽出結果を格納するために使用されるフィールドの名前。 |
例
例 1:順次探索的マッチングを実行します。
SPL 文
* | parse-regexp content, '(\S+)' as ip -- ip フィールドを生成します:10.0.0.0。 | parse-regexp content, '\S+\s+(\w+)' as method -- method フィールドを生成します:GET。入力データ
content: '10.0.0.0 GET /index.html 15824 0.043'出力
content: '10.0.0.0 GET /index.html 15824 0.043' ip: '10.0.0.0' method: 'GET'
例 2:名前のない正規表現キャプチャを使用して、完全なパターンマッチングを実行します。
SPL 文
* | parse-regexp content, '(\S+)\s+(\w+)' as ip, method入力データ
content: '10.0.0.0 GET /index.html 15824 0.043'出力
content: '10.0.0.0 GET /index.html 15824 0.043' ip: '10.0.0.0' method: 'GET'
parse-csv
指定されたフィールドから CSV 形式のデータを抽出します。
構文
| parse-csv -delim=<delim> -quote=<quote> -strict <field> as <output>, ...パラメーター
パラメーター | 型 | 必須 | 説明 |
delim | 文字列 | いいえ | データコンテンツの区切り文字。1 ~ 3 つの有効な ASCII 文字を指定できます。 エスケープ文字を使用して特殊文字を表すことができます。たとえば、\t はタブ文字、\11 は 8 進数の序数 11 の ASCII 文字、\x09 は 16 進数の序数 09 の ASCII 文字を表します。
デフォルト値はカンマ (,) です。 |
quote | 文字 | いいえ | データコンテンツの引用符。データコンテンツに区切り文字が含まれている場合に使用される単一の有効な ASCII 文字です。 例としては、二重引用符 (")、単一引用符 (')、不可視文字 (0x01) などがあります。 デフォルトでは、引用符は使用されません。 重要 このパラメーターは、delim パラメーターが 1 文字の場合にのみ有効になります。このパラメーターの値は、delim パラメーターの値と同じにすることはできません。 |
strict | ブール値 | いいえ | データコンテンツの値の数が
この機能はデフォルトでは無効になっています。有効にするには、このパラメーターを追加します。 |
field | フィールド | はい | 解析するソースフィールドの名前。 データコンテンツには、このフィールドが含まれている必要があります。フィールドは |
output | フィールド | はい | 解析されたデータコンテンツを格納するために使用されるフィールドの名前。 |
例
例 1:単純なデータマッチング。
SPL 文
* | parse-csv content as x, y, z入力データ
content: 'a,b,c'出力
content: 'a,b,c' x: 'a' y: 'b' z: 'c'
例 2:デフォルトの二重引用符 (") を引用符として使用して、特殊文字を含むコンテンツを照合します。
SPL 文
* | parse-csv content as ip, time, host入力データ
content: '192.168.0.100,"10/Jun/2019:11:32:16,127 +0800",example.aliyundoc.com'出力
content: '192.168.0.100,"10/Jun/2019:11:32:16,127 +0800",example.aliyundoc.com' ip: '192.168.0.100' time: '10/Jun/2019:11:32:16,127 +0800' host: 'example.aliyundoc.com'
例 3:複数文字の区切り文字を使用します。
SPL 文
* | parse-csv -delim='||' content as time, ip, req入力データ
content: '05/May/2022:13:30:28||127.0.0.1||POST /put?a=1&b=2'出力
content: '05/May/2022:13:30:28||127.0.0.1||POST /put?a=1&b=2' time: '05/May/2022:13:30:28' ip: '127.0.0.1' req: 'POST /put?a=1&b=2'
parse-json
JSON 形式の指定されたフィールドから最初のレイヤーのキーと値のペアを抽出します。
構文
| parse-json -mode=<mode> -path=<path> -prefix=<prefix> <field>パラメーター
パラメーター | 型 | 必須 | 説明 |
mode | 文字列 | いいえ | 新しいフィールドが入力データのフィールドと同じ名前の場合、結果の値モードを指定します。デフォルト値は overwrite です。 |
path | JSONPath | いいえ | 抽出するコンテンツを見つけるために、フィールドコンテンツ内の JSON パスを指定します。 デフォルト値は空の文字列で、指定されたフィールドのコンテンツ全体が直接抽出されることを示します。 |
prefix | 文字列 | いいえ | JSON 構造が展開された後の結果フィールドのプレフィックス。デフォルト値は空の文字列です。 |
field | フィールド | はい | 解析するソースフィールドの名前。 入力データには、このフィールドが含まれている必要があり、その値を null にすることはできず、次のいずれかの条件を満たす必要があります。そうでない場合、抽出操作は実行されません。
|
例
例 1:y フィールドからすべてのキーと値のペアを抽出します。
SPL 文
* | parse-json y入力データ
x: '0' y: '{"a": 1, "b": 2}'出力
x: '0' y: '{"a": 1, "b": 2}' a: '1' b: '2'
例 2:content フィールドから body キーの値を抽出し、次にそのすべてのキーと値のペアを抽出します。
SPL 文
* | parse-json -path='$.body' content入力データ
content: '{"body": {"a": 1, "b": 2}}'出力
content: '{"body": {"a": 1, "b": 2}}' a: '1' b: '2'
例 3:フィールド値の出力モードを preserve に設定して、既存のフィールドの元の値を保持します。
SPL 文
* | parse-json -mode='preserve' y入力データ
a: 'xyz' x: '0' y: '{"a": 1, "b": 2}'出力
x: '0' y: '{"a": 1, "b": 2}' a: 'xyz' b: '2'
parse-kv
指定されたフィールドからキーと値のペアを抽出します。
構文
区切り文字による抽出
指定された区切り文字に基づいてキーと値のペアを抽出します。
| parse-kv -mode=<mode> -prefix=<prefix> -greedy <field>, <delim>, <kv-sep>正規表現による抽出
指定された正規表現に基づいてキーと値のペアを抽出します。
| parse-kv -regexp -mode=<mode> -prefix=<prefix> <field>, <pattern>パラメーター
区切り文字による抽出
パラメーター | 型 | 必須 | 説明 |
mode | 文字列 | いいえ | 対応する宛先フィールドが入力データに既に存在する場合、データの上書きモードを選択できます。 デフォルト値は overwrite です。詳細については、「フィールド抽出の確認と上書きモード」をご参照ください。 |
prefix | 文字列 | いいえ | 抽出結果を含む出力フィールドの名前のプレフィックス。デフォルト値は空の文字列です。 |
greedy | ブール値 | いいえ | フィールド値の貪欲マッチングを有効にします。
|
field | フィールド | はい | 解析するソースフィールドの名前。
|
delim | 文字 | はい | 異なるキーと値のペア間の区切り文字。1 ~ 5 つの有効な ASCII 文字 (
|
kv-sep | 文字 | はい | キーと値のペア内のキーと値を接続する文字。1 ~ 5 つの有効な ASCII 文字 (
|
正規表現による抽出
パラメーター | 型 | 必須 | 説明 |
regexp | ブール値 | はい | 正規表現抽出モードを有効にします。 |
mode | 文字列 | いいえ | 対応する宛先フィールドが入力データに既に存在する場合、データの上書きモードを選択できます。 デフォルト値は overwrite です。詳細については、「フィールド抽出の確認と上書きモード」をご参照ください。 |
prefix | 文字列 | いいえ | 抽出結果を含む出力フィールドの名前のプレフィックス。デフォルト値は空の文字列です。 |
field | フィールド | はい | 抽出するソースフィールドの名前。 入力データには、このフィールドが含まれている必要があります。フィールドは |
pattern | 正規表現 | はい | 2 つのキャプチャグループを含む正規表現。最初のキャプチャグループはフィールド名を抽出し、2 番目のキャプチャグループはフィールド値を抽出します。RE2 構文がサポートされています。 |
例
例 1:複数文字の区切り文字を使用して、SLS メトリックデータからラベルをデータフィールドとして抽出します
SPL 文
* | parse-kv -prefix='__labels__.' __labels__, '|', '#$#'入力データ
__name__: 'net_in' __value__: '231461.57374215033' __time_nano__: '1717378679274117026' __labels__: 'cluster#$#sls-etl|hostname#$#iZbp17raa25u0xi4wifopeZ|interface#$#veth02cc91d2|ip#$#192.168.22.238'出力データ
__name__: 'net_in' __value__: '231461.57374215033' __time_nano__: '1717378679274117026' __labels__: 'cluster#$#sls-etl|hostname#$#iZbp17raa25u0xi4wifopeZ|interface#$#veth02cc91d2|ip#$#192.168.22.238' __labels__.cluster: 'sls-etl' __labels__.hostname: 'iZbp17raa25u0xi4wifopeZ' __labels__.interface: 'veth02cc91d2' __labels__.ip: '192.168.22.238'
例 2:貪欲マッチングモードを有効にして、アクセスログからキーと値のペアを抽出します。
SPL 文
* | parse-kv -greedy content, ' ', '='入力データ
content: 'src=127.0.0.1 dst=192.168.0.0 bytes=125 msg=connection refused body=this is test time=2024-05-21T00:00:00'出力データ
content: 'src=127.0.0.1 dst=192.168.0.0 bytes=125 msg=connection refused body=this is test time=2024-05-21T00:00:00' src: '127.0.0.1' dst: '192.168.0.0' bytes: '125' msg: 'connection refused' body: 'this is test' time: '2024-05-21T00:00:00'
例 3:正規表現抽出モードを使用して、複雑なキーと値のペアの区切り文字とキーと値の区切り文字を処理します。
SPL 文
* | parse-kv -regexp content, '([^&?]+)(?:=|:)([^&?]+)'入力データ
content: 'k1=v1&k2=v2?k3:v3' k1: 'xyz'出力データ
content: 'k1=v1&k2=v2?k3:v3' k1: 'v1' k2: 'v2' k3: 'v3'
例 4:フィールド値出力モードを preserve に設定して、既存フィールドの元の値を保持します。
SPL 文
* | parse-kv -regexp -mode='preserve' content, '([^&?]+)(?:=|:)([^&?]+)'入力データ
content: 'k1=v1&k2=v2?k3:v3' k1: 'xyz'出力
content: 'k1=v1&k2=v2?k3:v3' k1: 'xyz' k2: 'v2' k3: 'v3'