parse-kv 運算子
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel
從字串運算式擷取結構化資訊,並以索引鍵/值形式表示資訊。
支援下列擷取模式:
- 指定的 delimeter:根據指定的分隔符進行擷取,以指定索引鍵/值和配對彼此分隔的方式。
- 非指定的 delimeter:擷取不需要指定分隔符。 任何非虛構字元都會被視為分隔符。
- Regex:根據正則表達式進行擷取。
語法
指定的 delimeter
T parse-kv
|
表達式 as
(
索引鍵清單 with
=
pair_delimiter
)
(
PairDelimiter KvDelimiter =
kv_delimiter
,
[,
quote
=
QuoteChars ...[,
escape
=
EscapeChar ...]][,
greedy
=
true
])
未指定的分隔符
T parse-kv
|
運算式 (
as
索引鍵清單 with
(
)
[ =
quote
QuoteChars ...[,
escape
=
EscapeChar ...]])
RegEx
T |
parse-kv
運算式 (
as
索引鍵List 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
輸出
Text | 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 | bytes | failure |
---|---|---|---|---|
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 | bytes | failure |
---|---|---|---|---|
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 | bytes | failure |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | 傳送 “bye!” 的遠端主機 |
在貪婪模式中擷取
在某些情況下,未加上批注的值可能包含配對分隔符。 在此情況下,使用 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 | 電話 | 市/鎮 |
---|---|---|
John | 5:55 | 新增 |
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 | 電話 | 市/鎮 |
---|---|---|
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
輸出
Text | 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
輸出
Text | ThreadId | 機器 |
---|---|---|
服務 ' 已啟動 | 458745723 | Node001 |
使用 regex 進行擷取
當沒有分隔符定義足夠好的文字結構時,正則表達式型擷取可能會很有用。
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 | 廣告客戶標識碼 |
---|---|---|
https://hostname.com/redirect?dest=/?h=1234 |
https://hostname.com/?h=1234 |
24fefbca-cf27-4d62-a623-249c2ad30c73 |