本文主要介绍弱结构化数据提取指令的用法和示例。
parse-regexp
提取指定字段中的正则表达式分组匹配信息。
语法
| parse-regexp <field>, <pattern> as <output>, ...
参数说明
参数 | 类型 | 必填 | 说明 |
field | Field | 是 | 需要提取的原始字段名称。 要求输入数据包含该字段,类型须为 |
pattern | Regexp | 是 | 正则表达式,支持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>
正则提取
基于给定正则表达式,提取键值对。
| 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个正则捕获组的正则表达式,第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'