すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:半構造化データの抽出方法

最終更新日:Aug 19, 2025

このトピックでは、命令を使用して半構造化データを抽出する方法と、関連する例について説明します。

parse-regexp

正規表現グループに一致する指定されたフィールドから情報を抽出します。

重要
  • 抽出されたデータのデータ型は VARCHAR です。抽出されたフィールドが入力データのフィールドと同じ名前の場合、値の保持ポリシーについては、値の保持と上書きを参照してください。

  • __time__ および __time_ns_part__ 時間フィールドに対して操作を実行することはできません。詳細については、「時間フィールド」をご参照ください。

構文

| parse-regexp <field>, <pattern> as <output>, ...

パラメーター

パラメーター

必須

説明

field

フィールド

はい

抽出するソースフィールドの名前。

入力データには、このフィールドが含まれている必要があります。フィールドは VARCHAR 型である必要があり、その値は null にすることはできません。そうでない場合、抽出操作は実行されません。

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 形式のデータを抽出します。

重要
  • 抽出されたデータのデータ型は VARCHAR です。抽出されたフィールドが入力データのフィールドと同じ名前の場合、値の保持ポリシーについては、値の保持と上書きを参照してください。

  • __time__ および __time_ns_part__ 時間フィールドに対して操作を実行することはできません。詳細については、「時間フィールド」をご参照ください。

構文

| 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

ブール値

いいえ

データコンテンツの値の数が output で指定されたフィールドの数と一致しない場合に、厳密なマッチングを有効にするかどうかを指定します。

  • False:厳密でないマッチング。最大マッチングポリシーが使用されます。

    • 値の数がフィールドの数より多い場合、余分な値は出力されません。

    • フィールドの数が値の数より多い場合、余分なフィールドには空の文字列が出力されます。

  • True:厳密なマッチング。フィールドは出力されません。

この機能はデフォルトでは無効になっています。有効にするには、このパラメーターを追加します。

field

フィールド

はい

解析するソースフィールドの名前。

データコンテンツには、このフィールドが含まれている必要があります。フィールドは VARCHAR 型である必要があり、その値は null にすることはできません。そうでない場合、抽出操作は実行されません。

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 形式の指定されたフィールドから最初のレイヤーのキーと値のペアを抽出します。

重要
  • 抽出されたデータのデータ型は VARCHAR です。抽出されたフィールドが入力データのフィールドと同じ名前の場合、値の保持ポリシーについては、値の保持と上書きを参照してください。

  • __time__ および __time_ns_part__ 時間フィールドに対して操作を実行することはできません。詳細については、「時間フィールド」をご参照ください。

構文

| parse-json -mode=<mode> -path=<path> -prefix=<prefix> <field>

パラメーター

パラメーター

必須

説明

mode

文字列

いいえ

新しいフィールドが入力データのフィールドと同じ名前の場合、結果の値モードを指定します。デフォルト値は overwrite です。

path

JSONPath

いいえ

抽出するコンテンツを見つけるために、フィールドコンテンツ内の JSON パスを指定します。

デフォルト値は空の文字列で、指定されたフィールドのコンテンツ全体が直接抽出されることを示します。

prefix

文字列

いいえ

JSON 構造が展開された後の結果フィールドのプレフィックス。デフォルト値は空の文字列です。

field

フィールド

はい

解析するソースフィールドの名前。

入力データには、このフィールドが含まれている必要があり、その値を null にすることはできず、次のいずれかの条件を満たす必要があります。そうでない場合、抽出操作は実行されません。

  • 型は JSON です。

  • 型は VARCHAR で、値は有効な JSON 文字列です。

  • 例 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

指定されたフィールドからキーと値のペアを抽出します。

重要
  • 抽出されたデータのデータ型は VARCHAR です。抽出されたフィールドが入力データのフィールドと同じ名前の場合、値の保持ポリシーについては、値の保持と上書きを参照してください。

  • __time__ および __time_ns_part__ 時間フィールドに対して操作を実行することはできません。詳細については、「時間フィールド」をご参照ください。

構文

区切り文字による抽出

指定された区切り文字に基づいてキーと値のペアを抽出します。

| parse-kv -mode=<mode> -prefix=<prefix> -greedy <field>, <delim>, <kv-sep>

正規表現による抽出

指定された正規表現に基づいてキーと値のペアを抽出します。

| parse-kv -regexp -mode=<mode> -prefix=<prefix> <field>, <pattern>

パラメーター

区切り文字による抽出

パラメーター

必須

説明

mode

文字列

いいえ

対応する宛先フィールドが入力データに既に存在する場合、データの上書きモードを選択できます。

デフォルト値は overwrite です。詳細については、「フィールド抽出の確認と上書きモード」をご参照ください。

prefix

文字列

いいえ

抽出結果を含む出力フィールドの名前のプレフィックス。デフォルト値は空の文字列です。

greedy

ブール値

いいえ

フィールド値の貪欲マッチングを有効にします。

  • 無効:delim が見つかったときにフィールド値のマッチングを停止します。

  • 有効:次のキーと値のペアまでのすべてのコンテンツをフィールド値として照合します。

field

フィールド

はい

解析するソースフィールドの名前。

  1. このフィールドがデータ入力に存在しないか、その値が null の場合、入力は処理されません。

  2. データコンテンツでキーと値のペアが一致しない場合、入力は処理されません。

delim

文字

はい

異なるキーと値のペア間の区切り文字。1 ~ 5 つの有効な ASCII 文字 (^_^ など) を指定できます。

kv-sep の部分文字列を指定することはできません。

kv-sep

文字

はい

キーと値のペア内のキーと値を接続する文字。1 ~ 5 つの有効な ASCII 文字 (#$# など) を指定できます。

delim の部分文字列を指定することはできません。

正規表現による抽出

パラメーター

必須

説明

regexp

ブール値

はい

正規表現抽出モードを有効にします。

mode

文字列

いいえ

対応する宛先フィールドが入力データに既に存在する場合、データの上書きモードを選択できます。

デフォルト値は overwrite です。詳細については、「フィールド抽出の確認と上書きモード」をご参照ください。

prefix

文字列

いいえ

抽出結果を含む出力フィールドの名前のプレフィックス。デフォルト値は空の文字列です。

field

フィールド

はい

抽出するソースフィールドの名前。

入力データには、このフィールドが含まれている必要があります。フィールドは VARCHAR 型である必要があり、その値は null にすることはできません。そうでない場合、抽出操作は実行されません。

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'