parse-kv 运算符

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft 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