Extrahera data från ostrukturerade strängfält
Säkerhetsloggdata finns ofta i ostrukturerade strängfält och kräver parsning för att extrahera data. Det finns flera sätt att hämta information från strängfält i KQL. De två primära operatorerna som används är extrahera och parsa.
Extrahera
Extrahera hämtar en matchning för ett reguljärt uttryck från en textsträng. Du kan också konvertera den extraherade delsträngen till den angivna typen.
print extract("x=([0-9.]+)", 1, "hello x=45.6|wo") == "45.6"
Argument
regex: Ett reguljärt uttryck.
captureGroup: En positiv int-konstant som anger vilken avbildningsgrupp som ska extraheras. "0" står för hela matchningen, ett "1" för det värde som matchas av det första '('parentes')' i det reguljära uttrycket, 2 eller mer för efterföljande parenteser.
text: En sträng att söka efter.
typeLiteral: En valfri typliteral (till exempel typeof(long)). Om det anges konverteras den extraherade delsträngen till den här typen.
Returer
Om regex hittar en matchning i text: delsträngen som matchas mot den angivna capture group captureGroup, kan du konverteras till typeLiteral.
Om det inte finns någon matchning eller om typkonverteringen misslyckas: null.
I följande exempel används extraheringsfunktionen för att hämta kontonamnet från fältet Konto i tabellen 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
Tolka
Parsa utvärderar ett stränguttryck och parsar dess värde i en eller flera beräknade kolumner. De beräknade kolumnerna har null-värden för utan framgång parsade strängar.
Syntax
T | parse [kind=regex [flags=regex_flags] |simple|relaxed] Expression with * (StringConstant ColumnName [: ColumnType]) *
Argument
T: Indatatabellen.
Typ:
simple (standard): StringConstant är ett vanligt strängvärde och matchningen är strikt. Alla strängavgränsare ska visas i den parsade strängen och alla utökade kolumner måste matcha de typer som krävs.
regex: StringConstant kan vara ett reguljärt uttryck och matchningen är strikt. Alla strängavgränsare, som kan vara en regex för det här läget, bör visas i den tolkade strängen och alla utökade kolumner måste matcha de typer som krävs.
flaggor: Flaggor som ska användas i regexläge som U (Ungreedy), m (flerradsläge), s (matcha ny rad \n), i (skiftlägesokänslig) i RE2-flaggor.
avslappnad: StringConstant är ett vanligt strängvärde och matchningen är avslappnad. Alla strängavgränsare bör visas i den tolkade strängen, men utökade kolumner kan delvis matcha de typer som krävs. Utökade kolumner som inte matchade de nödvändiga typerna får värdet null.
Uttryck: Ett uttryck som utvärderas till en sträng.
ColumnName: Namnet på en kolumn som du vill tilldela ett värde till, extraherat från stränguttrycket.
ColumnType: Valfritt. Det skalära värdet som anger vilken typ som värdet ska konverteras till. Standardvärdet är strängtypen.
Returer
Indatatabellen utökas enligt listan över kolumner som tillhandahålls till operatorn.
Följande instruktion visar parsningsoperatorn, som utvärderar ett stränguttryck och parsar dess värde i en eller flera beräknade kolumner. Används för att strukturera ostrukturerade data.
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