本文介紹SPL指令的詳細資料。
參數類型說明
SPL指令中的參數類型說明如下表所示。
參數類型 | 說明 |
Bool | 布爾型別參數。使用SPL時,該參數為切換參數。 |
Char | ASCII字元型別參數,需使用單引號('')包裹,例如 |
Integer | 整數型別參數。 |
String | 字串型別參數,需使用單引號('')包裹,例如 |
RegExp | RE2Regex型別參數,需使用單引號('')包裹,例如 文法定義,請參見Syntax。 |
JSONPath | JSON路徑型別參數,需使用單引號('')包裹,例如 文法定義,請參見JsonPath。 |
Field | 欄位名型別參數,例如 如果欄位名中包含字母、數字、底線以外的特殊字元,需使用雙引號("")包裹,例如 說明 關於欄位名稱大小寫敏感詳情,請參見SPL在不同情境的功能定義。 |
FieldPattern | 欄位名和萬用字元組合或者欄位名型別參數。支援萬用字元號*,表示匹配0個或多個任一字元。需使用雙引號("")包裹,例如 說明 關於欄位名稱大小寫敏感詳情,請參見SPL在不同情境的功能定義。 |
SPLExp | SPL運算式型別參數。 |
SQLExp | SQL運算式型別參數。 |
欄位操作指令
project
保留與給定模式相匹配的欄位、同時可重新命名指定欄位。指令執行過程中,先執行完成所有欄位保留運算式,再執行重新命名運算式。
預設保留時間欄位__time__和__time_ns_part__,並且不可重新命名與覆蓋,更多資訊,請參見時間欄位。
文法
| project -wildcard <field-pattern>, <output>=<field>, ...
參數說明
參數 | 類型 | 必填 | 說明 |
wildcard | Bool | 否 | 是否開啟通配模式。預設為欄位精確匹配。您需要開啟通配模式時,需添加該參數。 |
field-pattern | FieldPattern | 是 | 需要保留的欄位名稱或欄位和萬用字元組合(處理匹配到的所有欄位)。 |
output | Field | 是 | 需要重新命名的新欄位名稱,不支援多次重新命名至相同的目標欄位。 重要 如果新欄位與輸入資料中欄位重名,其結果取值策略,請參見新舊值保留與覆蓋。 |
field | Field | 是 | 需要重新命名的原欄位名稱。
|
樣本
樣本1:保留特定欄位。
* | project level, err_msg
樣本2:重新命名欄位。
* | project log_level=level, err_msg
樣本3:保留精確匹配的欄位
__tag__:*
。* | project "__tag__:*"
project-away
移除與給定模式相匹配的欄位,原樣保留其他所有欄位。
該指令將預設保留時間欄位__time__和__time_ns_part__,更多詳情,請參見時間欄位。
文法
| project-away -wildcard <field-pattern>, ...
參數說明
參數 | 類型 | 必填 | 說明 |
wildcard | Bool | 否 | 是否開啟通配模式。預設為欄位精確匹配。您需要開啟通配模式時,需添加該參數。 |
field-pattern | FieldPattern | 是 | 需要移除的欄位名稱或者欄位和萬用字元組合(處理匹配到的所有欄位)。 |
project-rename
重新命名指定欄位,並保留其他所有欄位原樣。
預設保留時間欄位__time__和__time_ns_part__,並且不可重新命名與覆蓋,更多詳情,請參見時間欄位。
文法
| project-rename <output>=<field>, ...
參數說明
參數 | 類型 | 必填 | 說明 |
output | Field | 是 | 重新命名後的欄位名稱。不支援多次重新命名至相同的目標欄位。 重要 如果新欄位與輸入資料中欄位重名,其結果取值策略,請參見新舊值保留與覆蓋。 |
field | Field | 是 | 待重新命名的原欄位名稱。
|
樣本
重新命名指定欄位。
* | project-rename log_level=level, log_err_msg=err_msg
結構化資料SQL計算指令
extend
通過SQL運算式計算結果產生新欄位。支援的SQL函數列表,請參見SPL支援的SQL函數列表。
文法
| extend <output>=<sql-expr>, ...
參數說明
參數 | 類型 | 必填 | 說明 |
output | Field | 是 | 添加的目標欄位名稱。不支援多個運算式結果輸出至相同的目標欄位。 重要 如果目標欄位與輸入資料中欄位重名,則直接使用新的類型以及值將其覆蓋。 |
sql-expr | SQLExpr | 是 | 資料處理運算式。 重要 關於null值處理,請參見SPL運算式null值處理。 |
樣本
樣本1:使用計算運算式。
* | extend Duration = EndTime - StartTime
樣本2:使用Regex。
* | extend server_protocol_version=regexp_extract(server_protocol, '\d+')
樣本3:提取JSON路徑內容,並轉換部分欄位的資料類型。
SPL語句
* | extend a=json_extract(content, '$.body.a'), b=json_extract(content, '$.body.b') | extend b=cast(b as BIGINT)
輸入資料
content: '{"body": {"a": 1, "b": 2}}'
輸出結果
content: '{"body": {"a": 1, "b": 2}}' a: '1' b: 2
where
根據SQL運算式過濾資料,保留滿足SQL運算式的資料條目。where指令支援的SQL函數列表,請參見SPL支援的SQL函數列表。
文法
| where <sql-expr>
參數說明
參數 | 類型 | 必填 | 說明 |
sql-expr | SQLExp | 是 | SQL運算式,保留滿足此運算式的資料條目。 重要 SQL運算式中null值處理,請參見SPL運算式null值處理。 |
樣本
樣本1:根據欄位內容過濾資料條目。
* | where userId='123'
樣本2:使用匹配欄位名的Regex過濾資料條目。
* | where regexp_like(server_protocol, '\d+')
樣本3:轉換資料類型後,匹配所有服務端錯誤資料。
* | where cast(status as BIGINT) >= 500
弱結構化資料提取指令
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'