0

我对 KQL 很陌生,我可能对我用来解决这个问题的方法有完全错误的想法,所以请随时提出更好的方法,但我会尽力解释我想要实现的目标.

我正在用许多不同的查询查询一个特定的数据集,但一个一致的事情是需要将其中一列从一个疯狂的文本字段解析为多个列。

原始数据的列是“计算机”、“用户”之类的东西,然后是一个像这样的大字符串字段:

"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)"

所以我定义了一个函数(当不在函数中运行时有效)将该字符串列解析为多个字符串列:

Let parseEventData = (EventData:string){
EventData
| 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
}

所以现在我想输出一个新表,它是“Computer”、“User”、“resourceName”、“totalSlices”、“sliceNumber”、“lockTime”、“releaseTime”、“previousLockTime”,例如原始表但有这一列解析出来。

我试过这样的事情:

Events
| where parameter == "blah"
| project name,computer,parseEventData(EventData)

但它会给出错误

Operator source expression should be table or column

有没有办法将一个表添加到这样的 2 个现有列中,或者我是在吠叫错误的树吗?

笔记:

如果我根本不使用函数而只使用另一个管道并在那里进行解析,这确实有效。问题是我将在我所做的几乎每一个查询中使用这种类型的解析,我觉得每次写出整个事情可能真的很混乱/耗时!希望一切都有意义。

谢谢 :)

4

1 回答 1

1

你可以试试这个:

let EventData = datatable(Computer:string, User:string, EventText:string)
[
    "C1", "U1", "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)"
];
let parseEventData = (T:(EventText:string)) {
    T
    | parse EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previousLockTime:date ")" *  
    | extend resourceName, totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime
    | project-away EventText
};
parseEventData(EventData)
计算机 用户 资源名称 总切片 切片号 锁定时间 推出日期 上一个锁定时间
C1 U1 管道调度器 27 23 2016 年 2 月 17 日 08:40:01 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000

或者,您可以invoke按如下方式使用运算符:

EventData
| where <condition>
| invoke parseEventData()
于 2021-11-17T19:10:35.313 回答