从字符串表达式中提取结构化信息,并以键/值形式表示该信息。
支持以下提取模式:
语法
指定的分隔符
T|parse-kv表达as(KeysList)with(pair_delimiter=PairDelimiter,kv_delimiter=KvDelimiter [,quote=QuoteChars ...[,escape=EscapeChar ...]][,greedy=true] )
非指定的分隔符
T|parse-kv表达as(KeysList)with( [quote=QuoteChars ...[,escape=EscapeChar ...]] )
正则表达式
T|parse-kv表达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
输出
| 时间 | 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
输出
| 姓名 | 电话 | 城市 |
|---|---|---|
| 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
输出
| 姓名 | 电话 | 城市 |
|---|---|---|
| 无名氏 | 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 | 计算机 |
|---|---|---|
| 已开始 | 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 |