Gegevens extraheren uit ongestructureerde tekenreeksvelden

Voltooid

Beveiligingslogboekgegevens zijn vaak opgenomen in niet-gestructureerde tekenreeksvelden en moeten gegevens worden geparseerd. Er zijn meerdere manieren om informatie op te halen uit tekenreeksvelden in KQL. De twee primaire operators die worden gebruikt, zijn extraheren en parseren.

Extract

Extraheren haalt een overeenkomst op voor een reguliere expressie uit een tekenreeks. U kunt eventueel de geëxtraheerde subtekenreeks converteren naar het aangegeven type.

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

Argumenten

  • regex: een reguliere expressie.

  • captureGroup: Een positieve int-constante die aangeeft dat de opnamegroep moet worden geëxtraheerd. Een '0' staat voor de hele overeenkomst, een '1' voor de waarde die overeenkomt met de eerste '('haakje')' in de reguliere expressie, 2 of meer voor volgende haakjes.

  • tekst: Een tekenreeks om te zoeken.

  • typeLiteral: een optionele letterlijke type (bijvoorbeeld typeof(long)). Indien opgegeven, wordt de geëxtraheerde subtekenreeks geconverteerd naar dit type.

Retourneert

Als regex een overeenkomst in tekst vindt: de subtekenreeks die overeenkomt met de aangegeven capture group captureGroup, optioneel geconverteerd naar typeLiteral.

Als er geen overeenkomst is of als de typeconversie mislukt: null.

In het volgende voorbeeld wordt de extract-functie gebruikt om de accountnaam op te halen uit het veld Account van de tabel 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

parseren

Parseren evalueert een tekenreeksexpressie en parseert de waarde ervan in een of meer berekende kolommen. De berekende kolommen hebben null-waarden voor niet-geparseerde tekenreeksen.

Syntaxis

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

Argumenten

  • T: De invoertabel.

  • kind:

    • simple (de standaardinstelling): StringConstant is een normale tekenreekswaarde en de overeenkomst is strikt. Alle tekenreeksscheidingstekens moeten worden weergegeven in de geparseerde tekenreeks en alle uitgebreide kolommen moeten overeenkomen met de vereiste typen.

    • regex: StringConstant kan een reguliere expressie zijn en de overeenkomst is strikt. Alle tekenreeksscheidingstekens, die een regex voor deze modus kunnen zijn, moeten worden weergegeven in de geparseerde tekenreeks en alle uitgebreide kolommen moeten overeenkomen met de vereiste typen.

    • vlaggen: Vlaggen die moeten worden gebruikt in de regex-modus, zoals U (Ungreedy), m (multi-line mode), s (match new line \n), i (hoofdlettergevoelig) in RE2-vlaggen.

    • relaxed: StringConstant is een normale tekenreekswaarde en de overeenkomst is ontspannen. Alle tekenreeksscheidingstekens moeten worden weergegeven in de geparseerde tekenreeks, maar uitgebreide kolommen kunnen gedeeltelijk overeenkomen met de vereiste typen. Uitgebreide kolommen die niet overeenkomen met de vereiste typen, krijgen de waarde null.

  • Expressie: een expressie die resulteert in een tekenreeks.

  • ColumnName: de naam van een kolom waaraan een waarde moet worden toegewezen, geëxtraheerd uit de tekenreeksexpressie.

  • ColumnType: Optioneel. De scalaire waarde die het type aangeeft waarnaar de waarde moet worden geconverteerd. De standaardwaarde is het tekenreekstype.

Retourneert

De invoertabel is uitgebreid op basis van de lijst met kolommen die aan de operator worden verstrekt.

De volgende instructie demonstreert de parse-operator, waarmee een tekenreeksexpressie wordt geëvalueerd en de waarde wordt geparseerd in een of meer berekende kolommen. Gebruiken voor het structureren van ongestructureerde gegevens.

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