全部產品
Search
文件中心

Simple Log Service:弱結構化資料提取指令

更新時間:Aug 15, 2025

本文主要介紹弱結構化資料提取指令的用法和樣本。

parse-regexp

提取指定欄位中的Regex分組匹配資訊。

重要
  • 提取結果的資料類型為VARCHAR。如果結果欄位與輸入資料中欄位重名,取值策略請參見新舊值保留與覆蓋

  • 無法操作時間欄位__time__和__time_ns_part__,請參見時間欄位

文法

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

參數說明

參數

類型

必填

說明

field

Field

需要提取的原始欄位名稱。

要求輸入資料包含該欄位,類型須為VARCHAR,且其值為非null。否則,不執行提取操作。

pattern

Regexp

Regex,支援RE2正則文法。

output

Field

用於儲存正則提取結果的欄位名稱。

樣本

  • 樣本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

String

否​

資料內容的分隔字元為1至3個有效ASCII字元。

可使用轉義符表示特殊字元,比如\t表示定位字元、\11表示序號為八位元11對應的ASCII字元、\x09表示序號為十六進位數09對應的ASCII字元。

也可使用多個字元組合作為分隔字元,比如$$$, ^_^

預設值為英文逗號(,)。

quote

Char

否​

資料內容引用符是單個有效ASCII字元,在資料內容中包含分隔字元時使用。

比如雙引號(")、單引號(')以及不可見字元(0x01)。

預設不使用引用符。

重要

該參數僅在delim參數為單個字元時生效,且取值不能與delim相同。

strict

Bool

當資料內容中值的數量與output中指定欄位不一致時,是否開啟嚴格配對。

  • False:非嚴格配對,按照最大化配對策略執行。

    • 值的數目多於欄位時,多餘值不輸出。

    • 欄位數多於值時,多餘欄位輸出Null 字元串。

  • True:嚴格配對,不輸出任何欄位。

預設為關閉,需要開啟時,請添加此參數。

field

Field

需要解析的原欄位名稱。

要求資料內容包含該欄位,類型須為VARCHAR,且其值為非null。否則,不執行提取操作。

output

Field

用於儲存資料內容解析結果的欄位名稱。

樣本

  • 樣本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

String

如果新欄位與輸入資料中欄位重名,指定其結果取值模式。預設值為overwrite。

path

JSONPath

指定欄位內容中的JSON路徑,用於定位需要提取的內容位置。

預設值為空白字串,表示直接提取指定欄位的完整內容。

prefix

String

否​

JSON結構展開的結果欄位首碼,預設為空白字串。

field

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>

正則提取

基於給定Regex,提取索引值對。

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

參數說明

分隔字元提取

參數

類型

必填

說明

mode

String

如果相應的目標欄位已存在於輸入資料中,可選擇資料覆蓋模式。

預設值為overwrite。具體請參見欄位提取檢查與覆蓋模式

prefix

String

​否

提取結果輸出欄位名首碼,預設為空白字串。

greedy

Bool

開啟貪婪匹配欄位值。

  • 關閉:遇到delim即停止匹配欄位值。

  • 開啟:完整匹配下一個索引值對前的內容作為欄位值。

field

Field

需要解析的原欄位名稱。

  1. 如果此欄位在資料條目中不存在,或者其值為null,則不對該條目做任何處理。

  2. 如果資料內容未匹配到任何索引值對,則不對該條目做任何處理。

delim

Char

​是

不同索引值對之間的分隔字元,1至5個有效ASCII字元,例如^_^

不支援指定kv-sep的子字串。

kv-sep

Char

​是

索引值對內部串連鍵與值之間的字元,1至5個有效ASCII字元,例如#$#

不支援指定delim的子字串。

正則提取

參數

類型

必填

說明

regexp

Bool

開啟正則提模數式。

mode

String

如果相應的目標欄位已存在於輸入資料中,可選擇資料覆蓋模式。

預設值為overwrite。具體請參見欄位提取檢查與覆蓋模式

prefix

String

​否

提取結果輸出欄位名首碼,預設為空白字串。

field

Field

需要提取的原始欄位名稱。

要求輸入資料包含該欄位,類型須為VARCHAR,且其值為非null。否則,則不執行提取操作。

pattern

RegExpr

包含2個正則擷取的群組的Regex,第1個擷取的群組提取欄位名,第2個擷取的群組提取欄位值,支援RE2正則文法。

樣本

  • 樣本1:多字元分割提取SLS時序資料中的Label為資料欄位

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