Wyodrębnianie danych z pól ciągów bez struktury

Ukończone

Dane dziennika zabezpieczeń są często zawarte w polach ciągów bez struktury i wymagają analizowania w celu wyodrębnienia danych. Istnieje wiele sposobów ściągania informacji z pól ciągów w języku KQL. Dwa używane operatory podstawowe to wyodrębnianie i analizowanie.

Wyodrębnić

Wyodrębnianie pobiera dopasowanie wyrażenia regularnego z ciągu tekstowego. Opcjonalnie możesz przekonwertować wyodrębniony podciąg na wskazany typ.

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

Argumenty

  • wyrażenie regularne: wyrażenie regularne.

  • captureGroup: dodatnia stała int wskazująca grupę przechwytywania do wyodrębnienia. Wartość "0" oznacza całe dopasowanie, wartość "1" zgodną z pierwszą wartością "('nawias')" w wyrażeniu regularnym, 2 lub więcej dla kolejnych nawiasów.

  • text: ciąg do wyszukania.

  • typeLiteral: opcjonalny literał typu (na przykład typeof(long)). Jeśli zostanie podany, wyodrębniony podciąg zostanie przekonwertowany na ten typ.

Powroty

Jeśli wyrażenie regularne znajdzie dopasowanie w tekście: podciąg dopasowany do wskazanej grupy przechwytywania grupy przechwytywania, opcjonalnie przekonwertowany na typeLiteral.

Jeśli nie ma dopasowania lub konwersja typu zakończy się niepowodzeniem: null.

W poniższym przykładzie użyto funkcji extract, aby ściągnąć nazwę konta z pola Account tabeli 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

analizowanie

Analizowanie oblicza wyrażenie ciągu i analizuje jego wartość w co najmniej jednej kolumnie obliczeniowej. Obliczone kolumny będą miały wartości null dla nieudanych analizowanych ciągów.

Składnia

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

Argumenty

  • T: Tabela wejściowa.

  • Rodzaju:

    • simple (wartość domyślna): StringConstant jest regularną wartością ciągu, a dopasowanie jest ścisłe. Wszystkie ograniczniki ciągów powinny być wyświetlane w przeanalizowanym ciągu, a wszystkie rozszerzone kolumny muszą być zgodne z wymaganymi typami.

    • regex: CiągConstant może być wyrażeniem regularnym, a dopasowanie jest ścisłe. Wszystkie ograniczniki ciągów, które mogą być wyrażeniem regularnym dla tego trybu, powinny być wyświetlane w przeanalizowanym ciągu, a wszystkie kolumny rozszerzone muszą być zgodne z wymaganymi typami.

    • flagi: flagi do użycia w trybie wyrażeń regularnych, takich jak U (ungreedy), m (tryb wielowierszowy), s (dopasowanie nowego wiersza \n), i (bez uwzględniania wielkości liter) w flagach RE2.

    • zrelaksowany: CiągConstant jest regularną wartością ciągu, a dopasowanie jest złagodzone. Wszystkie ograniczniki ciągów powinny być wyświetlane w przeanalizowanym ciągu, ale rozszerzone kolumny mogą częściowo odpowiadać wymaganym typom. Kolumny rozszerzone, które nie są zgodne z wymaganymi typami, otrzymają wartość null.

  • Wyrażenie: wyrażenie, które daje w wyniku ciąg.

  • Nazwakolumny: nazwa kolumny do przypisania wartości wyodrębnionej z wyrażenia ciągu.

  • Typ kolumny: opcjonalne. Wartość skalarna wskazująca typ, na który ma być konwertowana wartość. Wartość domyślna to typ ciągu.

Powroty

Tabela wejściowa została rozszerzona zgodnie z listą kolumn dostarczonych do operatora.

Poniższa instrukcja demonstruje operator analizy, który oblicza wyrażenie ciągu i analizuje jego wartość w co najmniej jednej kolumnie obliczeniowej. Służy do tworzenia struktury danych bez struktury.

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