從非結構化字串欄位解壓縮資料

已完成

安全性記錄資料通常包含在非結構化字串欄位中,需要剖析才能將資料解壓縮。 有多種方式可以從 KQL 中的字串欄位提取資訊。 所使用的兩個主要運算子是解壓縮和剖析。

extract (擷取)

extract():從文字字串取得規則運算式的相符項目。 您也可以選擇將擷取的 substring 轉換成指定的類型。

print extract("x=([0-9.]+)", 1, "hello x=45.6|wo") == "45.6"

引數

  • regex:規則運算式。

  • captureGroup:指出要擷取之擷取群組的正整數。 「0」代表整個相符項目、「1」代表規則運算式中第一個 '('括弧')' 所相符的值,「2」或以上的數字代表後續的括弧。

  • 文字:要搜尋的字串。

  • typeLiteral:選用的型別常值 (例如 typeof(long))。 若提供了此數值,擷取的 substring 將會轉換為此型別。

傳回

若 RegEx 在文字中找到了相符項目:能選用將與指示的擷取群組 captureGroup 相符的 substring 轉換成 typeLiteral。

如果沒有相符項目或類型轉換失敗,則傳回 Null。

下列範例會使用[解壓縮]函數,從 SecurityEvent 資料表的 Account 欄位提取帳戶名稱。

SecurityEvent
| where EventID == 4672 and AccountType == 'User'
| extend Account_Name = extract(@"^(.*\\)?([^@]*)(@.*)?$", 2, tolower(Account))
| summarize LoginCount = count() by Account_Name
| where Account_Name != ""
| where LoginCount < 10

parse (剖析)

剖析會評估字串運算式,並將其值剖析至一或多個計算的資料行。 計算結果欄出現 Null,代表未成功剖析的字串。

語法

T | parse [kind=regex [flags=regex_flags] |simple|relaxed] Expression with * (StringConstant ColumnName [: ColumnType]) *

引數

  • T:輸入資料表。

  • kind (種類):

    • simple (簡單,此為預設選項):StringConstant 為標準字串值且相符標準嚴格。 所有字串分隔符號都應出現在剖析字串中,而所有擴展資料行皆必須與要求的型別相符。

    • RegEx:StringConstant 可能為規則運算式且相符標準嚴格。 所有字串分隔符號 (可以是此模式的規則運算式) 都應出現在剖析字串中,而所有擴展資料行皆必須與要求的型別相符。

    • flags:用於 RegEx 模式的旗標,例如 RE2 旗標中的 U (非窮盡 ( Ungreedy ))、 m (多行模式)、 s (符合新行 \n )、 i (不區分大小寫)。

    • relaxed (寬鬆):StringConstant 為標準字串值且相符標準寬鬆。 所有字串分隔符號都應出現在剖析字串中,但是擴展資料行則可以與要求的型別部分相符。 與要求的型別不相符的擴展資料行,其值將會是 null。

  • Expression (運算式):會評估為字串的運算式。

  • ColumnName (資料行名稱):能指派值至其中的資料行名稱,擷取自字串運算式。

  • ColumnType (資料行類型):選用。 指示要將值轉換成何種型別的純量值。 預設值為字串類型。

傳回

輸入資料表將根據提供給運算子的資料行清單以進行擴充。

下列陳述式示範剖析運算子,其會評估字串運算式,並將其值剖析為一或多個計算結果欄。 用來將非結構化資料結構化。

let Traces = datatable(EventText:string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces  
| parse EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previousLockTime:date ")" *  
| project resourceName, totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime