Extrakce dat z nestrukturovaných řetězcových polí
Data protokolu zabezpečení jsou často obsažena v nestrukturovaných řetězcových polích a vyžadují analýzu dat. Existuje několik způsobů, jak v KQL načíst informace z řetězcových polí. Použité dva primární operátory jsou extrakce a analýza.
Extrahovat
Extrakce získá shodu regulárního výrazu z textového řetězce. Extrahovaný podřetětěr můžete volitelně převést na zadaný typ.
print extract("x=([0-9.]+)", 1, "hello x=45.6|wo") == "45.6"
Argumenty
regulární výraz.
captureGroup: Pozitivní int konstanta označující skupinu zachycení k extrakci. "0" znamená celou shodu, "1" pro hodnotu, která odpovídá první závorce ('závorka') v regulárním výrazu, 2 nebo více pro následné závorky.
text: Řetězec, který se má prohledávat.
typeLiteral: Volitelný literál typu (například typeof(long)). Pokud je k dispozici, extrahovaný podřetětěr je převeden na tento typ.
Vrácení
Pokud regulární výraz najde shodu v textu: podřetěc spárovaný s označenou skupinou captureGroup, volitelně převedený na typeLiteral.
Pokud neexistuje žádná shoda nebo převod typu selže: null.
Následující příklad používá funkci extrakce k získání názvu účtu z pole Account v tabulce SecurityEvent.
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
Analyzovat
Analýza vyhodnotí řetězcový výraz a parsuje jeho hodnotu do jednoho nebo více počítaných sloupců. Počítané sloupce budou mít hodnoty null pro neúspěšně parsované řetězce.
Syntaxe
T | parse [kind=regex [flags=regex_flags] |simple|relaxed] Expression with * (StringConstant ColumnName [: ColumnType]) *
Argumenty
T: Vstupní tabulka.
Druhu:
Simple (výchozí): StringConstant je běžná řetězcová hodnota a shoda je striktní. Všechny oddělovače řetězců by se měly objevit v analyzovaném řetězci a všechny rozšířené sloupce musí odpovídat požadovaným typům.
regulární výraz: StringConstant může být regulární výraz a shoda je striktní. Všechny oddělovače řetězců, které mohou být výrazem regex pro tento režim, by se měly objevit v analyzovaném řetězci a všechny rozšířené sloupce musí odpovídat požadovaným typům.
příznaky: Příznaky, které se mají použít v režimu regulárního výrazu, jako je U (Ungreedy), m (víceřádkový režim), s (shoda nového řádku \n), i (nerozlišující malá a velká písmena) v příznakech RE2.
uvolněné: StringConstant je běžná řetězcová hodnota a shoda je uvolněná. Všechny oddělovače řetězců by se měly objevit v analyzovaném řetězci, ale rozšířené sloupce můžou částečně odpovídat požadovaným typům. Rozšířené sloupce, které neodpovídají požadovaným typům, získají hodnotu null.
Výraz: Výraz, který se vyhodnotí jako řetězec.
ColumnName: Název sloupce, ke kterému se má přiřadit hodnota extrahovaná z řetězcového výrazu.
ColumnType: Volitelné. Skalární hodnota označující typ, na který se má hodnota převést. Výchozí hodnota je typ řetězce.
Vrácení
Vstupní tabulka byla rozšířena podle seznamu sloupců zadaných operátorem.
Následující příkaz ukazuje operátor analýzy, který vyhodnotí řetězcový výraz a parsuje jeho hodnotu do jednoho nebo více počítaných sloupců. Slouží ke strukturování nestrukturovaných dat.
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