Extrair dados de campos de cadeia de caracteres não estruturados

Concluído

Geralmente, os dados de log de segurança ficam contidos em campos de cadeia de caracteres não estruturados e sua extração exige análise. Há várias maneiras de extrair informações de campos de cadeia de caracteres no KQL. Os dois principais operadores usados são extract e parse.

extract

Extract obtém uma correspondência que responde a uma expressão regular por meio 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. O "0" significa toda a correspondência, um "1" para o valor correspondido pelo primeiro '('parêntese')' na expressão regular, dois ou mais para os parênteses subsequentes.

  • text: uma cadeia de caracteres a ser pesquisada.

  • typeLiteral: um literal de tipo opcional (por exemplo, typeof(long)). Se for fornecido, a subcadeia de caracteres extraída será convertida para esse tipo.

Retornos

Se regex encontrar uma correspondência em text: a subcadeia de caracteres correspondida com base no grupo de captura indicado captureGroup, convertida, opcionalmente, em typeLiteral.

Se não houver correspondência ou a conversão de tipo falhar, ela retornará 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

Analisar avalia uma expressão de cadeia de caracteres e analisa o valor dela em uma ou mais colunas calculadas. As colunas computadas exibirão nulo 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.

  • kind:

    • simples (o padrão): StringConstant é um valor de cadeia de caracteres 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 multilinha), s (correspondência de nova linha \n), i (não diferencia maiúsculas de minúsculas), da RE2.

    • relaxed: StringConstant é um valor de cadeia de caracteres regular e a correspondência é reduzida. Todos os delimitadores de cadeia de caracteres devem aparecer na cadeia de caracteres analisada, mas todas as colunas estendidas devem fazer correspondência parcial com os tipos necessários. As colunas estendidas que não corresponderam aos tipos necessários receberão o valor nulo.

  • Expressão: uma expressão 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 no qual converter o valor. O padrão é o tipo cadeia de caracteres.

Retornos

A tabela de entrada estendida de acordo com a lista de colunas que são fornecidas para o operador.

A instrução a seguir demonstra o operador de análise, que avalia uma expressão de cadeia de caracteres e analisa o valor dela 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