Wyodrębnianie danych z pól ciągów bez struktury
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