本文主要介紹弱結構化資料提取指令的用法和樣本。
parse-regexp
提取指定欄位中的Regex分組匹配資訊。
文法
| parse-regexp <field>, <pattern> as <output>, ...參數說明
參數 | 類型 | 必填 | 說明 |
field | Field | 是 | 需要提取的原始欄位名稱。 要求輸入資料包含該欄位,類型須為 |
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格式的資訊。
文法
| 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 | 否 | 當資料內容中值的數量與
預設為關閉,需要開啟時,請添加此參數。 |
field | Field | 是 | 需要解析的原欄位名稱。 要求資料內容包含該欄位,類型須為 |
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資訊。
文法
| parse-json -mode=<mode> -path=<path> -prefix=<prefix> <field>參數說明
參數 | 類型 | 必填 | 說明 |
mode | String | 否 | 如果新欄位與輸入資料中欄位重名,指定其結果取值模式。預設值為overwrite。 |
path | JSONPath | 否 | 指定欄位內容中的JSON路徑,用於定位需要提取的內容位置。 預設值為空白字串,表示直接提取指定欄位的完整內容。 |
prefix | String | 否 | JSON結構展開的結果欄位首碼,預設為空白字串。 |
field | 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>正則提取
基於給定Regex,提取索引值對。
| parse-kv -regexp -mode=<mode> -prefix=<prefix> <field>, <pattern>參數說明
分隔字元提取
參數 | 類型 | 必填 | 說明 |
mode | String | 否 | 如果相應的目標欄位已存在於輸入資料中,可選擇資料覆蓋模式。 預設值為overwrite。具體請參見欄位提取檢查與覆蓋模式。 |
prefix | String | 否 | 提取結果輸出欄位名首碼,預設為空白字串。 |
greedy | Bool | 否 | 開啟貪婪匹配欄位值。
|
field | Field | 是 | 需要解析的原欄位名稱。
|
delim | Char | 是 | 不同索引值對之間的分隔字元,1至5個有效ASCII字元,例如 不支援指定 |
kv-sep | Char | 是 | 索引值對內部串連鍵與值之間的字元,1至5個有效ASCII字元,例如 不支援指定 |
正則提取
參數 | 類型 | 必填 | 說明 |
regexp | Bool | 是 | 開啟正則提模數式。 |
mode | String | 否 | 如果相應的目標欄位已存在於輸入資料中,可選擇資料覆蓋模式。 預設值為overwrite。具體請參見欄位提取檢查與覆蓋模式。 |
prefix | String | 否 | 提取結果輸出欄位名首碼,預設為空白字串。 |
field | Field | 是 | 需要提取的原始欄位名稱。 要求輸入資料包含該欄位,類型須為 |
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'