Estrarre dati da campi stringa non strutturati
I dati del log di sicurezza sono spesso contenuti in campi stringa non strutturati ed è necessario eseguire l'analisi per estrarli. Per estrarre informazioni dai campi stringa in KQL è possibile procedere in diversi modi. I due operatori primari usati sono extract e parse.
extract
extract recupera una corrispondenza di un'espressione regolare da una stringa di testo. È possibile facoltativamente convertire la substring estratta nel tipo indicato.
print extract("x=([0-9.]+)", 1, "hello x=45.6|wo") == "45.6"
Argomenti
regex:espressione regolare.
captureGroup: una costante int positiva indicante il gruppo Capture da estrarre. Il valore "0" indica la corrispondenza completa, "1" il valore corrispondente alle prime "("parentesi")" nell'espressione regolare, "2" o valori successivi per le parentesi successive.
text: una stringa da cercare.
typeLiteral: valore letterale di tipo facoltativo, ad esempio typeof(long). Se specificato, la sottostringa estratta viene convertita nel tipo.
Valori restituiti
Se regex trova una corrispondenza in text: sottostringa corrispondente nel gruppo Capture indicato captureGroup, facoltativamente convertita in typeLiteral.
Se non ci sono corrispondenze o la conversione del tipo non riesce, restituisce Null.
L'esempio seguente mostra l'uso della funzione extract per estrarre il nome dell'account dal campo Account della tabella 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
parse
L'operatore parse valuta un'espressione stringa e analizza il relativo valore in una o più colonne calcolate. Le colonne calcolate includeranno valori Null per le stringhe non analizzate correttamente.
Sintassi
T | parse [kind=regex [flags=regex_flags] |simple|relaxed] Expression with * (StringConstant ColumnName [: ColumnType]) *
Argomenti
T: tabella di input.
kind:
simple (impostazione predefinita): StringConstant è un valore stringa regolare e la corrispondenza è strict. Nella stringa analizzata dovranno comparire tutti i delimitatori di stringa e tutte le colonne estese devono corrispondere ai tipi richiesti.
regex: StringConstant può essere un'espressione regolare e la corrispondenza è rigorosa. Nella stringa analizzata dovranno comparire tutti i delimitatori di stringa, che possono essere regex per questa modalità, e tutte le colonne estese devono corrispondere ai tipi richiesti.
flags: i flag da usare in modalità regex, come U (ungreedy), m (modalità multiriga), s (corrispondenza nuova riga \n), i (senza distinzione maiuscole/minuscole), nei flag RE2.
rilassato: StringConstant è un valore stringa regolare e la corrispondenza è rilassata. Nella stringa analizzata dovranno comparire tutti i delimitatori di stringa, ma le colonne estese potrebbero corrispondere parzialmente ai tipi richiesti. Le colonne estese che non corrispondono ai tipi richiesti ottengono il valore Null.
Espressione: espressione che restituisce una stringa.
ColumnName: nome di una colonna a cui assegnare un valore, estratto dall'espressione stringa.
ColumnType: facoltativo. Il valore calare che indica il tipo in cui convertire il valore. Il valore predefinito è il tipo di stringa.
Valori restituiti
La tabella di input, estesa in base all'elenco di colonne fornite all'operatore.
L'istruzione seguente illustra l'operatore parse, che valuta un'espressione stringa e analizza il relativo valore in una o più colonne calcolate. Usare per la strutturazione di dati non strutturati.
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