Extrair dados de campos de cadeia de caracteres não estruturados
Os dados de log de segurança geralmente estão contidos em campos de cadeia de caracteres não estruturados e exigem análise para extrair dados. Há várias maneiras de extrair informações de campos de cadeia de caracteres no KQL. Os dois operadores primários utilizados são extrato e análise.
extrato
Extract obtém uma correspondência para uma expressão regular de uma cadeia de caracteres de texto. Opcionalmente, você pode converter a substring extraída para o tipo indicado.
print extract("x=([0-9.]+)", 1, "hello x=45.6|wo") == "45.6"
Argumentos
regex: Uma expressão regular.
captureGroup: Uma constante int positiva que indica o grupo de captura a ser extraído. Um "0" representa toda a correspondência, um "1" para o valor correspondente pelo primeiro '('parêntese')' na expressão regular, 2 ou mais para parênteses subsequentes.
text: Uma cadeia de caracteres para pesquisar.
typeLiteral: um literal de tipo opcional (por exemplo, typeof(long)). Se fornecida, a substring extraída é convertida para esse tipo.
Devolve
Se o regex encontrar uma correspondência no texto: a substring correspondeu à captureGroup do grupo de captura indicado, opcionalmente convertida para typeLiteral.
Se não houver correspondência ou se a conversão de tipo falhar: null.
O exemplo a seguir usa a função extract para extrair o Nome da Conta do campo Conta da tabela 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
analisar
Parse avalia uma expressão de cadeia de caracteres e analisa seu valor em uma ou mais colunas calculadas. As colunas computadas terão nulls para cadeias de caracteres analisadas sem êxito.
Sintaxe
T | parse [kind=regex [flags=regex_flags] |simple|relaxed] Expression with * (StringConstant ColumnName [: ColumnType]) *
Argumentos
T: A tabela de entrada.
Tipo:
simple (o padrão): StringConstant é um valor de string regular e a correspondência é estrita. Todos os delimitadores de cadeia de caracteres devem aparecer na cadeia de caracteres analisada e todas as colunas estendidas devem corresponder aos tipos necessários.
regex: StringConstant pode ser uma expressão regular e a correspondência é estrita. Todos os delimitadores de cadeia de caracteres, que podem ser um regex para esse modo, devem aparecer na cadeia de caracteres analisada e todas as colunas estendidas devem corresponder aos tipos necessários.
flags: Sinalizadores a serem usados no modo regex como U (Ungreedy), m (modo multi-linha), s (corresponder a nova linha \n), i (sem distinção entre maiúsculas e minúsculas) em bandeiras RE2.
relaxed: StringConstant é um valor de string regular e a correspondência é relaxada. Todos os delimitadores de cadeia de caracteres devem aparecer na cadeia de caracteres analisada, mas as colunas estendidas podem corresponder parcialmente aos tipos necessários. As colunas estendidas que não corresponderem aos tipos necessários obterão o valor nulo.
Expressão: uma expressão que é avaliada como uma cadeia de caracteres.
ColumnName: O nome de uma coluna à qual atribuir um valor, extraído da expressão de cadeia de caracteres.
ColumnType: Opcional. O valor escalar que indica o tipo para o qual converter o valor. O padrão é o tipo de cadeia de caracteres.
Devolve
A tabela de entrada estendida de acordo com a lista de colunas que são fornecidas ao operador.
A instrução a seguir demonstra o operador parse, que avalia uma expressão de cadeia de caracteres e analisa seu valor em uma ou mais colunas calculadas. Use para estruturar dados não estruturados.
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