SPL指令
本文介紹SPL指令的詳細(xì)信息。
參數(shù)類型說(shuō)明
SPL指令中的參數(shù)類型說(shuō)明如下表所示。
參數(shù)類型 | 說(shuō)明 |
Bool | 布爾類型參數(shù)。使用SPL時(shí),該參數(shù)為開(kāi)關(guān)參數(shù)。 |
Char | ASCII字符類型參數(shù),需使用單引號(hào)('')包裹,例如 |
Integer | 整數(shù)類型參數(shù)。 |
String | 字符串類型參數(shù),需使用單引號(hào)('')包裹,例如 |
RegExp | RE2正則表達(dá)式類型參數(shù),需使用單引號(hào)('')包裹,例如 語(yǔ)法定義,請(qǐng)參見(jiàn)Syntax。 |
JSONPath | JSON路徑類型參數(shù),需使用單引號(hào)('')包裹,例如 語(yǔ)法定義,請(qǐng)參見(jiàn)JsonPath。 |
Field | 字段名類型參數(shù),例如 如果字段名中包含字母、數(shù)字、下劃線以外的特殊字符,需使用雙引號(hào)("")包裹,例如 說(shuō)明 關(guān)于字段名稱大小寫敏感詳情,請(qǐng)參見(jiàn)SPL在不同場(chǎng)景的功能定義。 |
FieldPattern | 字段名和通配符組合或者字段名類型參數(shù)。支持通配符號(hào)*,表示匹配0個(gè)或多個(gè)任意字符。需使用雙引號(hào)("")包裹,例如 說(shuō)明 關(guān)于字段名稱大小寫敏感詳情,請(qǐng)參見(jiàn)SPL在不同場(chǎng)景的功能定義。 |
SPLExp | SPL表達(dá)式類型參數(shù)。 |
SQLExp | SQL表達(dá)式類型參數(shù)。 |
SPL指令列表
指令類別 | 指令名稱 | 說(shuō)明 |
字段操作指令 | 保留與給定模式相匹配的字段、同時(shí)可重命名指定字段。指令執(zhí)行過(guò)程中,先完成所有字段保留表達(dá)式的執(zhí)行,再執(zhí)行重命名表達(dá)式。 | |
移除與給定模式相匹配的字段,原樣保留其他所有字段。 | ||
重命名指定字段,并保留其他所有字段原樣。 | ||
展開(kāi)指定字段的第一層JSON對(duì)象,生成多條結(jié)果。 | ||
結(jié)構(gòu)化數(shù)據(jù)SQL計(jì)算指令 | 通過(guò)SQL表達(dá)式計(jì)算結(jié)果產(chǎn)生新字段。支持的SQL函數(shù)列表,請(qǐng)參見(jiàn)SPL支持的SQL函數(shù)列表。 | |
根據(jù)SQL表達(dá)式過(guò)濾數(shù)據(jù),保留滿足SQL表達(dá)式的數(shù)據(jù)條目。where指令支持的SQL函數(shù)列表,請(qǐng)參見(jiàn)SPL支持的SQL函數(shù)列表。 | ||
弱結(jié)構(gòu)化數(shù)據(jù)提取指令 | 提取指定字段中的正則表達(dá)式分組匹配信息。 | |
提取指定字段中的CSV格式的信息。 | ||
提取指定字段中的第一層JSON信息。 | ||
提取指定字段中的鍵值對(duì)信息。 |
字段操作指令
project
保留與給定模式相匹配的字段、同時(shí)可重命名指定字段。指令執(zhí)行過(guò)程中,先執(zhí)行完成所有字段保留表達(dá)式,再執(zhí)行重命名表達(dá)式。
默認(rèn)保留時(shí)間字段__time__和__time_ns_part__,并且不可重命名與覆蓋,更多信息,請(qǐng)參見(jiàn)時(shí)間字段。
語(yǔ)法
| project -wildcard <field-pattern>, <output>=<field>, ...
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
wildcard | Bool | 否 | 是否開(kāi)啟通配模式。默認(rèn)為字段精確匹配。您需要開(kāi)啟通配模式時(shí),需添加該參數(shù)。 |
field-pattern | FieldPattern | 是 | 需要保留的字段名稱或字段和通配符組合(處理匹配到的所有字段)。 |
output | Field | 是 | 需要重命名的新字段名稱,不支持多次重命名至相同的目標(biāo)字段。 重要 如果新字段與輸入數(shù)據(jù)中字段重名,其結(jié)果取值策略,請(qǐng)參見(jiàn)新舊值保留與覆蓋。 |
field | Field | 是? | 需要重命名的原字段名稱。
|
示例
示例1:保留特定字段。
* | project level, err_msg
示例2:重命名字段。
* | project log_level=level, err_msg
示例3:保留精確匹配的字段
__tag__:*
。* | project "__tag__:*"
project-away
移除與給定模式相匹配的字段,原樣保留其他所有字段。
該指令將默認(rèn)保留時(shí)間字段__time__和__time_ns_part__,更多詳情,請(qǐng)參見(jiàn)時(shí)間字段。
語(yǔ)法
| project-away -wildcard <field-pattern>, ...
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
wildcard | Bool | 否 | 是否開(kāi)啟通配模式。默認(rèn)為字段精確匹配。您需要開(kāi)啟通配模式時(shí),需添加該參數(shù)。 |
field-pattern | FieldPattern | 是 | 需要移除的字段名稱或者字段和通配符組合(處理匹配到的所有字段)。 |
project-rename
重命名指定字段,并保留其他所有字段原樣。
默認(rèn)保留時(shí)間字段__time__和__time_ns_part__,并且不可重命名與覆蓋,更多詳情,請(qǐng)參見(jiàn)時(shí)間字段。
語(yǔ)法
| project-rename <output>=<field>, ...
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
output | Field | 是 | 重命名后的字段名稱。不支持多次重命名至相同的目標(biāo)字段。 重要 如果新字段與輸入數(shù)據(jù)中字段重名,其結(jié)果取值策略,請(qǐng)參見(jiàn)新舊值保留與覆蓋。 |
field | Field | 是 | 待重命名的原字段名稱。
|
示例
重命名指定字段。
* | project-rename log_level=level, log_err_msg=err_msg
expand-values
展開(kāi)指定字段的第一層JSON對(duì)象,生成多條結(jié)果。
展開(kāi)結(jié)果的數(shù)據(jù)類型為VARCHAR。如果結(jié)果字段與輸入數(shù)據(jù)中字段重名,取值策略請(qǐng)參見(jiàn)新舊值保留與覆蓋。
無(wú)法操作時(shí)間字段
__time__
和__time_ns_part__
,請(qǐng)參見(jiàn)時(shí)間字段。支持場(chǎng)景:數(shù)據(jù)加工(新版)。不同SPL使用場(chǎng)景請(qǐng)參見(jiàn)SPL在不同場(chǎng)景的功能定義。
語(yǔ)法
| expand-values -path=<path> -limit=<limit> -keep <field> as <output>
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
path | JSONPath | 否? | 指定字段內(nèi)容中的JSON路徑,用于定位需要提取的內(nèi)容位置。 默認(rèn)值為空,表示直接提取指定字段的完整內(nèi)容。 |
limit | Integer | 否 | 每條原始數(shù)據(jù)可展開(kāi)的最大條目數(shù),值為1至10之間的整數(shù)。默認(rèn)值為10。 |
keep | Bool | 否 | 展開(kāi)后是否保留原字段。默認(rèn)不保留,需要保留時(shí),打開(kāi)此開(kāi)關(guān)。 |
field | Field | 是 | 需要展開(kāi)的原字段名稱,支持類型為 |
output | Filed | 否 | 展開(kāi)的目標(biāo)字段名稱。如果不指定,則默認(rèn)輸出結(jié)果至輸入字段。 針對(duì)原始內(nèi)容的展開(kāi)邏輯為: JSON數(shù)組:根據(jù)數(shù)組的元素逐個(gè)展開(kāi)。 JSON字典:根據(jù)字典鍵值對(duì)逐個(gè)展開(kāi)。 其他JSON類型:返回原值。 非法JSON:返回 |
示例
示例1:展開(kāi)數(shù)組,輸出多條結(jié)果數(shù)據(jù)。
SPL語(yǔ)句
* | expand-values y
輸入數(shù)據(jù)
x: 'abc' y: '[0,1,2]'
輸出數(shù)據(jù),展開(kāi)為3條數(shù)據(jù)
# 條目1 x: 'abc' y: '0' # 條目2 x: 'abc' y: '1' # 條目3 x: 'abc' y: '2'
示例2:展開(kāi)字典,輸出多條結(jié)果數(shù)據(jù)。
SPL語(yǔ)句
* | expand-values y
輸入數(shù)據(jù)
x: 'abc' y: '{"a": 1, "b": 2}'
輸出數(shù)據(jù),展開(kāi)為2條數(shù)據(jù)
# 條目1 x: 'abc' y: '{"a": 1}' # 條目2 x: 'abc' y: '{"b": 2}'
示例3:展開(kāi)指定JSON Path下的內(nèi)容,并輸出至新字段。
SPL語(yǔ)句
* | expand-values -keep content -path='$.body' as body
輸入數(shù)據(jù)
content: '{"body": [0, {"a": 1, "b": 2}]}'
輸出數(shù)據(jù),展開(kāi)為2條數(shù)據(jù)
# 條目1 content: '{"body": [1, 2]}' body: '0' # 條目2 content: '{"body": [1, 2]}' body: '{"a": 1, "b": 2}'
結(jié)構(gòu)化數(shù)據(jù)SQL計(jì)算指令
extend
通過(guò)SQL表達(dá)式計(jì)算結(jié)果產(chǎn)生新字段。支持的SQL函數(shù)列表,請(qǐng)參見(jiàn)SPL支持的SQL函數(shù)列表。
語(yǔ)法
| extend <output>=<sql-expr>, ...
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
output | Field | 是 | 添加的目標(biāo)字段名稱。不支持多個(gè)表達(dá)式結(jié)果輸出至相同的目標(biāo)字段。 重要 如果目標(biāo)字段與輸入數(shù)據(jù)中字段重名,則直接使用新的類型以及值將其覆蓋。 |
sql-expr | SQLExpr | 是 | 數(shù)據(jù)處理表達(dá)式。 重要 關(guān)于null值處理,請(qǐng)參見(jiàn)SPL表達(dá)式null值處理。 |
示例
示例1:使用計(jì)算表達(dá)式。
* | extend Duration = EndTime - StartTime
示例2:使用正則表達(dá)式。
* | extend server_protocol_version=regexp_extract(server_protocol, '\d+')
示例3:提取JSON路徑內(nèi)容,并轉(zhuǎn)換部分字段的數(shù)據(jù)類型。
SPL語(yǔ)句
* | extend a=json_extract(content, '$.body.a'), b=json_extract(content, '$.body.b') | extend b=cast(b as BIGINT)
輸入數(shù)據(jù)
content: '{"body": {"a": 1, "b": 2}}'
輸出結(jié)果
content: '{"body": {"a": 1, "b": 2}}' a: '1' b: 2
where
根據(jù)SQL表達(dá)式過(guò)濾數(shù)據(jù),保留滿足SQL表達(dá)式的數(shù)據(jù)條目。where指令支持的SQL函數(shù)列表,請(qǐng)參見(jiàn)SPL支持的SQL函數(shù)列表。
語(yǔ)法
| where <sql-expr>
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
sql-expr | SQLExp | 是 | SQL表達(dá)式,保留滿足此表達(dá)式的數(shù)據(jù)條目。 重要 SQL表達(dá)式中null值處理,請(qǐng)參見(jiàn)SPL表達(dá)式null值處理。 |
示例
示例1:根據(jù)字段內(nèi)容過(guò)濾數(shù)據(jù)條目。
* | where userId='123'
示例2:使用匹配字段名的正則表達(dá)式過(guò)濾數(shù)據(jù)條目。
* | where regexp_like(server_protocol, '\d+')
示例3:轉(zhuǎn)換數(shù)據(jù)類型后,匹配所有服務(wù)端錯(cuò)誤數(shù)據(jù)。
* | where cast(status as BIGINT) >= 500
弱結(jié)構(gòu)化數(shù)據(jù)提取指令
parse-regexp
提取指定字段中的正則表達(dá)式分組匹配信息。
語(yǔ)法
| parse-regexp <field>, <pattern> as <output>, ...
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
field | Field | 是 | 需要提取的原始字段名稱。 要求輸入數(shù)據(jù)包含該字段,類型須為 |
pattern | Regexp | 是 | 正則表達(dá)式,支持RE2正則語(yǔ)法。 |
output | Field | 否 | 用于存儲(chǔ)正則提取結(jié)果的字段名稱。 |
示例
示例1:探索式逐個(gè)進(jìn)行匹配。
SPL語(yǔ)句
* | parse-regexp content, '(\S+)' as ip -- 生成字段ip: 10.0.0.0。 | parse-regexp content, '\S+\s+(\w+)' as method -- 生成字段method: GET。
輸入數(shù)據(jù)
content: '10.0.0.0 GET /index.html 15824 0.043'
輸出結(jié)果
content: '10.0.0.0 GET /index.html 15824 0.043' ip: '10.0.0.0' method: 'GET'
示例2:完整模式匹配,使用非命名正則捕獲。
SPL語(yǔ)句
* | parse-regexp content, '(\S+)\s+(\w+)' as ip, method
輸入數(shù)據(jù)
content: '10.0.0.0 GET /index.html 15824 0.043'
輸出結(jié)果
content: '10.0.0.0 GET /index.html 15824 0.043' ip: '10.0.0.0' method: 'GET'
parse-csv
提取指定字段中的CSV格式的信息。
語(yǔ)法
| parse-csv -delim=<delim> -quote=<quote> -strict <field> as <output>, ...
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
delim | String | 否? | 數(shù)據(jù)內(nèi)容的分隔字符為1至3個(gè)有效ASCII字符。 可使用轉(zhuǎn)義符表示特殊字符,比如\t表示制表符、\11表示序號(hào)為八進(jìn)制數(shù)11對(duì)應(yīng)的ASCII字符、\x09表示序號(hào)為十六進(jìn)制數(shù)09對(duì)應(yīng)的ASCII字符。 也可使用多個(gè)字符組合作為分隔符,比如 默認(rèn)值為英文逗號(hào)(,)。 |
quote | Char | 否? | 數(shù)據(jù)內(nèi)容引用符是單個(gè)有效ASCII字符,在數(shù)據(jù)內(nèi)容中包含分隔符時(shí)使用。 比如雙引號(hào)(")、單引號(hào)(')以及不可見(jiàn)字符(0x01)。 默認(rèn)不使用引用符。 重要 該參數(shù)僅在delim參數(shù)為單個(gè)字符時(shí)生效,且取值不能與delim相同。 |
strict | Bool | 否 | 當(dāng)數(shù)據(jù)內(nèi)容中值的數(shù)量與
默認(rèn)為關(guān)閉,需要開(kāi)啟時(shí),請(qǐng)?zhí)砑哟藚?shù)。 |
field | Field | 是 | 需要解析的原字段名稱。 要求數(shù)據(jù)內(nèi)容包含該字段,類型須為 |
output | Field | 是 | 用于存儲(chǔ)數(shù)據(jù)內(nèi)容解析結(jié)果的字段名稱。 |
示例
示例1:簡(jiǎn)單數(shù)據(jù)匹配。
SPL語(yǔ)句
* | parse-csv content as x, y, z
輸入數(shù)據(jù)
content: 'a,b,c'
輸出結(jié)果
content: 'a,b,c' x: 'a' y: 'b' z: 'c'
示例2:默認(rèn)使用雙引號(hào)作為引用符,匹配包含特殊字符的內(nèi)容。
SPL語(yǔ)句
* | parse-csv content as ip, time, host
輸入數(shù)據(jù)
content: '192.168.0.100,"10/Jun/2019:11:32:16,127 +0800",example.aliyundoc.com'
輸出結(jié)果
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語(yǔ)句
* | parse-csv -delim='||' content as time, ip, req
輸入數(shù)據(jù)
content: '05/May/2022:13:30:28||127.0.0.1||POST /put?a=1&b=2'
輸出結(jié)果
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信息。
語(yǔ)法
| parse-json -mode=<mode> -path=<path> -prefix=<prefix> <field>
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
mode | String | 否 | 如果新字段與輸入數(shù)據(jù)中字段重名,指定其結(jié)果取值模式。默認(rèn)值為overwrite。 |
path | JSONPath | 否 | 指定字段內(nèi)容中的JSON路徑,用于定位需要提取的內(nèi)容位置。 默認(rèn)值為空字符串,表示直接提取指定字段的完整內(nèi)容。 |
prefix | String | 否? | JSON結(jié)構(gòu)展開(kāi)的結(jié)果字段前綴,默認(rèn)為空字符串。 |
field | Field | 是 | 需要解析的原字段名稱。 要求輸入數(shù)據(jù)包含該字段,其值為非null,且滿足以下條件之一。否則,不執(zhí)行提取操作。
|
示例
示例1:提取y字段中的所有鍵值。
SPL語(yǔ)句
* | parse-json y
輸入數(shù)據(jù)
x: '0' y: '{"a": 1, "b": 2}'
輸出結(jié)果
x: '0' y: '{"a": 1, "b": 2}' a: '1' b: '2'
示例2:提取content字段中的body鍵對(duì)應(yīng)的內(nèi)容,并將其所有鍵值提取為字段。
SPL語(yǔ)句
* | parse-json -path='$.body' content
輸入數(shù)據(jù)
content: '{"body": {"a": 1, "b": 2}}'
輸出結(jié)果
content: '{"body": {"a": 1, "b": 2}}' a: '1' b: '2'
示例3:指定字段值輸出模式為preserve,對(duì)于已有字段,保留原始值。
SPL語(yǔ)句
* | parse-json -mode='preserve' y
輸入數(shù)據(jù)
a: 'xyz' x: '0' y: '{"a": 1, "b": 2}'
輸出結(jié)果
x: '0' y: '{"a": 1, "b": 2}' a: 'xyz' b: '2'
parse-kv
提取指定字段中的鍵值對(duì)信息。
語(yǔ)法
| parse-kv -mode=<mode> -prefix=<prefix> -regexp <field>, <pattern>
參數(shù)
參數(shù) | 類型 | 必填 | 說(shuō)明 |
mode | String | 否 | 如果相應(yīng)的目標(biāo)字段已存在于輸入數(shù)據(jù)中,可選擇數(shù)據(jù)覆蓋模式。 默認(rèn)值為overwrite。具體參考字段值覆蓋模式。 |
prefix | String | ?否 | 提取結(jié)果輸出字段名前綴,默認(rèn)為空字符串。 |
regexp | Bool | 是 | 開(kāi)啟正則提取模式。 |
field | Field | 是 | 需要提取的原始字段名稱。 要求輸入數(shù)據(jù)包含該字段,類型須為 |
pattern | RegExpr | 是 | 包含2個(gè)正則捕獲組的正則表達(dá)式,第1個(gè)捕獲組提取字段名,第2個(gè)捕獲組提取字段值,支持RE2正則語(yǔ)法。 |
示例
示例1:正則提取模式,處理復(fù)雜的鍵值對(duì)之間的定界符、以及鍵與值之間的分隔符。
SPL語(yǔ)句
* | parse-kv -regexp content, '([^&?]+)(?:=|:)([^&?]+)'
輸入數(shù)據(jù)
content: 'k1=v1&k2=v2?k3:v3' k1: 'xyz'
輸出數(shù)據(jù)
content: 'k1=v1&k2=v2?k3:v3' k1: 'v1' k2: 'v2' k3: 'v3'
示例2:正則提取模式,并指定字段值輸出模式為preserve,對(duì)于已有字段,保留原始值。
SPL語(yǔ)句
* | parse-kv -regexp -mode='preserve' content, '([^&?]+)(?:=|:)([^&?]+)'
輸入數(shù)據(jù)
content: 'k1=v1&k2=v2?k3:v3' k1: 'xyz'
輸出結(jié)果
content: 'k1=v1&k2=v2?k3:v3' k1: 'xyz' k2: 'v2' k3: 'v3'
示例3:正則提取模式,提取復(fù)雜非結(jié)構(gòu)數(shù)據(jù),值格式為數(shù)字或者雙引號(hào)包裹的字符串。
SPL語(yǔ)句
* | parse-kv -regexp content, '([^&?]+)(?:=|:)([^&?]+)'
輸入數(shù)據(jù)
content: 'verb="GET" URI="/healthz" latency="45.911μs" userAgent="kube-probe/1.30+" audit-ID="" srcIP="192.168.123.45:40092" contentType="text/plain; charset=utf-8" resp=200'
輸出結(jié)果
content: 'verb="GET" URI="/healthz" latency="45.911μs" userAgent="kube-probe/1.30+" audit-ID="" srcIP="192.168.123.45:40092" contentType="text/plain; charset=utf-8" resp=200' verb: 'GET' URI: '/healthz' latency: '45.911μs' userAgent: 'kube-probe/1.30+' audit-ID: '' srcIP: '192.168.123.45:40092' contentType: 'text/plain; charset=utf-8' resp: '200'