你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
parse-kv 运算符
适用于:✅Microsoft Fabric✅Azure 数据资源管理器Azure Monitor✅Microsoft✅ Sentinel
从字符串表达式中提取结构化信息,并以键/值形式表示该信息。
支持以下提取模式:
语法
指定的分隔符
T |
parse-kv
Expression as
(
KeysList )
with
(
pair_delimiter
=
PairDelimiter ,
kv_delimiter
=
KvDelimiter [,
quote
=
QuoteChars ... [,
escape
=
EscapeChar ...]] [,
greedy
=
true
] )
非指定的分隔符
T |
parse-kv
Expression as
(
KeysList )
with
(
[quote
=
QuoteChars ... [,
escape
=
EscapeChar ...]] )
正则表达式
T |
parse-kv
Expression as
(
KeysList )
with
(
regex
=
RegexPattern)
)
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
表达式 | string |
✔️ | 要从中提取键值的表达式。 |
KeysList | string |
✔️ | 以逗号分隔的键名称及其值数据类型列表。 键的顺序不必与文本中显示的顺序匹配。 |
PairDelimiter | string |
一个将键值对彼此分开的分隔符。 | |
KvDelimiter | string |
一个将键与值分开的分隔符。 | |
QuoteChars | string |
一个由一个或两个字符组成的字符串字面量,表示可能包含键名或提取值的左引号和右引号。 可以重复该参数以指定单独的一组左引号/右引号。 | |
EscapeChar | string |
由一个字符组成的字符串字面量(描述字符),可用于转义带引号的值中的特殊字符。 如果使用多个转义字符,则可以重复该参数。 | |
RegexPattern | string |
一个恰好包含两个捕获组的正则表达式。 第一组表示键名,第二组表示键值。 |
返回
原始输入表格表达式 T,使用每个要提取的指定键的列进行扩展。
备注
- 如果某个键未出现在记录中,则相应的列值将是
null
或空字符串,具体取决于列类型。 - 仅提取运算符中列出的键。
- 提取第一个出现的键,忽略后续的值。
- 提取键和值时,忽略前导空格和尾随空格。
示例
使用定义完善的分隔符进行提取
在下面的示例中,键和值由定义完善的分隔符分隔。 这些分隔符是逗号和冒号字符。
print str="ThreadId:458745723, Machine:Node001, Text: The service is up, Level: Info"
| parse-kv str as (Text: string, ThreadId:long, Machine: string) with (pair_delimiter=',', kv_delimiter=':')
| project-away str
输出
文本 | ThreadId | 计算机 |
---|---|---|
服务已启动 | 458745723 | Node001 |
使用值引用进行提取
有时,键名或值用引号括起来,这使值本身可以包含分隔符字符。 下面的例子展示了如何使用 quote
参数提取此类值。
print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure="connection aborted" "event time"=2021-01-01T10:00:54'
| parse-kv str as (['event time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='"')
| project-away str
输出
事件时间 | src | dst | 字节 | 失败 |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | 连接已中止 |
以下示例使用不同的左引号和右引号:
print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure=(connection aborted) (event time)=(2021-01-01 10:00:54)'
| parse-kv str as (['event time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='()')
| project-away str
输出
事件时间 | src | dst | 字节 | 失败 |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | 连接已中止 |
值本身可能包含正确转义的引号字符,如以下示例所示:
print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure="the remote host sent \\"bye!\\"" time=2021-01-01T10:00:54'
| parse-kv str as (['time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='"', escape='\\')
| project-away str
输出
time | src | dst | 字节 | 失败 |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | 远程主机发送“再见!” |
在贪婪模式下提取
在某些情况下,不带引号的值可能包含对分隔符。 在这种情况下,使用 greedy
模式指示运算符在查找值结尾时扫描直到下一个键出现(或字符串结尾)。
以下示例比较了运算符在指定和不指定 greedy
模式的情况下的工作方式:
print str='name=John Doe phone=555 5555 city=New York'
| parse-kv str as (name:string, phone:string, city:string) with (pair_delimiter=' ', kv_delimiter='=')
| project-away str
输出
name | phone | city |
---|---|---|
John | 555 | 新建 |
print str='name=John Doe phone=555 5555 city=New York'
| parse-kv str as (name:string, phone:string, city:string) with (pair_delimiter=' ', kv_delimiter='=', greedy=true)
| project-away str
输出
name | phone | city |
---|---|---|
John Doe | 555 5555 | 纽约 |
使用定义不完善的分隔符进行提取
在以下示例中,任何非字母数字的字符都被视为有效的分隔符:
print str="2021-01-01T10:00:34 [INFO] ThreadId:458745723, Machine:Node001, Text: Started"
| parse-kv str as (Text: string, ThreadId:long, Machine: string)
| project-away str
输出
文本 | ThreadId | 计算机 |
---|---|---|
Started | 458745723 | Node001 |
在此模式下允许使用引用和转义的值,如以下示例所示:
print str="2021-01-01T10:00:34 [INFO] ThreadId:458745723, Machine:Node001, Text: 'The service \\' is up'"
| parse-kv str as (Text: string, ThreadId:long, Machine: string) with (quote="'", escape='\\')
| project-away str
输出
文本 | ThreadId | 计算机 |
---|---|---|
服务已启动 | 458745723 | Node001 |
使用正则表达式进行提取
如果没有分隔符能够很好地定义文本结构,则基于正则表达式的提取可能会很有用。
print str=@'["referer url: https://hostname.com/redirect?dest=/?h=1234", "request url: https://hostname.com/?h=1234", "advertiser id: 24fefbca-cf27-4d62-a623-249c2ad30c73"]'
| parse-kv str as (['referer url']:string, ['request url']:string, ['advertiser id']: guid) with (regex=@'"([\w ]+)\s*:\s*([^"]*)"')
| project-away str
输出
引用方 url | 请求 url | 广告商 ID |
---|---|---|
https://hostname.com/redirect?dest=/?h=1234 |
https://hostname.com/?h=1234 |
24fefbca-cf27-4d62-a623-249c2ad30c73 |