Regex Nifi-将键值对提取到新字段中
使用Nifi,我尝试使用ReplaceText处理器来提取键值对。 JSON文件的相关部分是“RuleName”:Regex Nifi-将键值对提取到新字段中,regex,apache-nifi,Regex,Apache Nifi,使用Nifi,我尝试使用ReplaceText处理器来提取键值对。 JSON文件的相关部分是“RuleName”: "winlog": { "channel": "Microsoft-Windows-Sysmon/Operational", "event_id": 3, "api": "wineventlog", "process": { "pid": 1640, "thread": { "id": 4452 }
"winlog": {
"channel": "Microsoft-Windows-Sysmon/Operational",
"event_id": 3,
"api": "wineventlog",
"process": {
"pid": 1640,
"thread": {
"id": 4452
}
},
"version": 5,
"record_id": 521564887,
"computer_name": "SERVER001",
"event_data": {
"RuleName": "Technique=Commonly Used Port,Tactic=Command and Control,MitreRef=1043"
},
"provider_guid": "{5790385F-C22A-43E0-BF4C-06F5698FFBD9}",
"opcode": "Info",
"provider_name": "Microsoft-Windows-Sysmon",
"task": "Network connection detected (rule: NetworkConnect)",
"user": {
"identifier": "S-1-5-18",
"name": "SYSTEM",
"domain": "NT AUTHORITY",
"type": "Well Known Group"
}
},
在ReplaceText处理器中,我有以下配置
第一个问题是没有创建新字段MitreRef等。
第二件事是字段可能以任何顺序出现在原始JSON中,例如。
“规则名称”:“技术=常用端口,战术=命令和控制,米特雷夫=1043”
或
miteref=1043,战术=指挥控制,技术=常用端口
有关于如何继续的想法吗?欢迎来到StackOverflow 你的问题很含糊,我试着猜猜你的目的是什么 用JSON表示替换“RuleName”的字符串值 我假设您要替换该条目
"RuleName": "Technique=Commonly Used Port,Tactic=Command and Control,MitreRef=1043"
有点类似于
"RuleName": {
"Technique": "Commonly Used Port",
"Tactic": "Command and Control",
"MitreRef": "1043"
}
在本例中,您基本上可以抓住整行,并假设您有三组字符,每组由
([^=]+)
=
([^,]+)
,
基于这些假设,您可以在ReplaceText处理器的Search Value属性中编写以下正则表达式:
"RuleName"\s*:\s*"([^=]+)=([^,]+),([^=]+)=([^,]+),([^=]+)=([^,]+)"
这样,您就可以抓住整条线,为每个重要的数据点建立一个组。
根据组,您可以将替换值设置为:
产生上述JSON对象
一些评论
"RuleName":
"Technique=Commonly Used Port,Tactic=Command and Control,MitreRef=1043"
(,([^=]+)=([^,]+)?
添加到上一个表达式中,该表达式大致转换为:
()?
-将括号中的内容匹配零次或一次,
-匹配字符逗号([^=]+)=([^,]+)
-后跟上文解释的字符组"RuleName"\s*:\s*"([^=]+)=([^,]+),([^=]+)=([^,]+),([^=]+)=([^,]+)(,([^=]+)=([^,]+))?"
要允许使用新值,还必须调整替换值。
您可以使用大多数NiFi处理器属性中可用的ExpressionL语言来决定是否向JSON对象添加另一项
${'$7':isEmpty():ifElse(
'',
${literal(', "'):append(${'$8'}):append('": '):append('"'):append(${'$9'}):append('"')}
)}
这个表达式将检查第七个正则表达式组是否存在,并附加一个空字符串或找到的值
包括此修改后,整个重置价值如下所示:
"RuleName": {
"${'$1'}": "${'$2'}",
"${'$3'}": "${'$4'}",
"${'$5'}": "${'$6'}"
${'$7':isEmpty():ifElse(
'',
${literal(', "'):append(${'$8'}):append('": '):append('"'):append(${'$9'}):append('"')}
)}
}
{
"event_data": {
"RuleName": {
"Technique": "Commonly Used Port",
"Tactic": "Command and Control",
"MitreRef": "1043",
"Foo": "Bar"
}
},
"RuleName": {
"Technique": "Commonly Used Port",
"Tactic": "Command and Control",
"MitreRef": "1043"
}
}
关于多次发生
ReplaceText处理器替换它找到的正则表达式匹配的所有匹配项。使用最后一段中提供的设置,给出以下示例输入
{
"event_data": {
"RuleName": "Technique=Commonly Used Port,Tactic=Command and Control,MitreRef=1043,Foo=Bar"
},
"RuleName": "Technique=Commonly Used Port,Tactic=Command and Control,MitreRef=1043"
}
将导致以下结果:
"RuleName": {
"${'$1'}": "${'$2'}",
"${'$3'}": "${'$4'}",
"${'$5'}": "${'$6'}"
${'$7':isEmpty():ifElse(
'',
${literal(', "'):append(${'$8'}):append('": '):append('"'):append(${'$9'}):append('"')}
)}
}
{
"event_data": {
"RuleName": {
"Technique": "Commonly Used Port",
"Tactic": "Command and Control",
"MitreRef": "1043",
"Foo": "Bar"
}
},
"RuleName": {
"Technique": "Commonly Used Port",
"Tactic": "Command and Control",
"MitreRef": "1043"
}
}
示例模板
您可以下载我创建的包含上述处理器的模板。欢迎使用StackOverflow 你的问题很含糊,我试着猜猜你的目的是什么 用JSON表示替换“RuleName”的字符串值 我假设您要替换该条目
"RuleName": "Technique=Commonly Used Port,Tactic=Command and Control,MitreRef=1043"
有点类似于
"RuleName": {
"Technique": "Commonly Used Port",
"Tactic": "Command and Control",
"MitreRef": "1043"
}
在本例中,您基本上可以抓住整行,并假设您有三组字符,每组由
([^=]+)
=
([^,]+)
,
基于这些假设,您可以在ReplaceText处理器的Search Value属性中编写以下正则表达式:
"RuleName"\s*:\s*"([^=]+)=([^,]+),([^=]+)=([^,]+),([^=]+)=([^,]+)"
这样,您就可以抓住整条线,为每个重要的数据点建立一个组。
根据组,您可以将替换值设置为:
产生上述JSON对象
一些评论
"RuleName":
"Technique=Commonly Used Port,Tactic=Command and Control,MitreRef=1043"
(,([^=]+)=([^,]+)?
添加到上一个表达式中,该表达式大致转换为:
()?
-将括号中的内容匹配零次或一次,
-匹配字符逗号([^=]+)=([^,]+)
-后跟上文解释的字符组"RuleName"\s*:\s*"([^=]+)=([^,]+),([^=]+)=([^,]+),([^=]+)=([^,]+)(,([^=]+)=([^,]+))?"
要允许使用新值,还必须调整替换值。
您可以使用大多数NiFi处理器属性中可用的ExpressionL语言来进行d