Extracción de datos de campos de cadena no estructurados

Completado

Los datos de los registros de seguridad suelen estar en campos de cadena no estructurados y requieren un análisis para extraer datos. En KQL, hay varias maneras de extraer información de los campos de cadena. Los dos operadores principales son extract y parse.

extract

Extract obtiene una coincidencia con una expresión regular de una cadena de texto. Tiene la opción de convertir la subcadena extraída en el tipo indicado.

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

Argumentos

  • regex: una expresión regular.

  • captureGroup: constante de entero positivo que indica el grupo de captura que debe extraerse. Un "0" significa toda la coincidencia; un "1", el valor que coincide con el primer elemento "("paréntesis")" de la expresión regular; 2 o más, los posteriores paréntesis.

  • text: cadena que se va a buscar.

  • typeLiteral: literal de tipo opcional; por ejemplo, typeof(long). Si se proporciona, la subcadena extraída se convierte a este tipo.

Devuelve

Si regex encuentra una coincidencia en text: la subcadena coincidía con el grupo de captura indicado, captureGroup, opcionalmente convertido a typeLiteral.

Si no hay ninguna coincidencia o no se puede convertir el tipo: NULL.

En el ejemplo siguiente, se usa la función extract para extraer el nombre de cuenta del campo Account de la tabla 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

Parse evalúa una expresión de cadena y analiza su valor en una o más columnas calculadas. Las columnas calculadas tendrán valores NULL para las cadenas que no se analicen correctamente.

Sintaxis

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

Argumentos

  • T: la tabla de entrada.

  • kind:

    • simple (valor predeterminado): StringConstant es un valor de cadena normal y las coincidencias son estrictas. Todos los delimitadores de cadena deben aparecer en la cadena analizada, y todas las columnas extendidas deben coincidir con los tipos necesarios.

    • regex: StringConstant puede ser una expresión regular y las coincidencias son estrictas. Todos los delimitadores de cadena, que pueden ser una expresión regular para este modo, deben aparecer en la cadena analizada, y todas las columnas extendidas deben coincidir con los tipos necesarios.

    • flags: marcas que se usarán en el modo regex, como U (no expansivo), m (modo multilínea), s (coincidir con una nueva línea \n), i (no distinguir mayúsculas de minúsculas) en marcas de RE2.

    • relaxed: StringConstant es un valor de cadena normal y las coincidencias son flexibles. Todos los delimitadores de cadena deben aparecer en la cadena analizada, pero las columnas extendidas pueden coincidir parcialmente con los tipos necesarios. Las columnas extendidas que no coincidan con los tipos necesarios recibirán el valor NULL.

  • Expression (Expresión): expresión que se evalúa como una cadena.

  • ColumnName: nombre de una columna a la que se va a asignar un valor, extraído de la expresión de cadena.

  • ColumnType: Opcional. El valor escalar que indica el tipo al que se convertirá el valor. El valor predeterminado es el tipo de cadena.

Devoluciones

Tabla de entrada ampliada según la lista de columnas que se proporcionan al operador.

La siguiente instrucción muestra el operador parse, que evalúa una expresión de cadena y analiza su valor en una o varias columnas calculadas. Úselo para estructurar datos no estructurados.

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