如何用KQL查询列名含IP的表中近90天IP值含192的数据
KQL 需求实现方案
该需求可以实现,你编写的原始语句不符合KQL语法规范:where子句不支持直接用*IP*通配符匹配字段名进行值过滤,可通过动态对象处理函数完成需求,正确写法如下:
union * // 优先过滤时间,减少后续计算的数据量 | where TimeGenerated > ago(90d) // 将当前行所有字段打包为动态字典对象 | extend all_cols = bag_pack_all() // 提取所有字段名中包含"IP"的字段列表 | extend ip_field_list = array_filter(bag_keys(all_cols), (field_name) => field_name contains "IP") // 判断任意一个IP字段的取值是否包含"192" | where array_any(ip_field_list, (field) => tostring(all_cols[field]) contains "192") // 可选:移除查询过程中生成的辅助字段,只保留原始表字段 | project-away all_cols, ip_field_list
优化注意事项
- 跨全表查询(
union *)配合90天的时间范围查询性能通常较差,如果你清楚目标数据所属的表,建议直接指定表名列表,例如改为union WafLog, VmFlowLog,能大幅提升查询效率 - 部分自定义上报的表可能没有
TimeGenerated字段,遇到报错可以调整为union withsource=TableName * | where isnotempty(TimeGenerated)过滤掉无时间字段的表 - 如果要避免误匹配到字段值中其他位置的192字符,可以将
contains "192"调整为startswith "192.",只匹配192开头的IPv4网段
内容的提问来源于stack exchange,提问作者G. Micskei
相关产品推荐
相关产品推荐

