Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Nifi-将键值对提取到新字段中_Regex_Apache Nifi - Fatal编程技术网

Regex Nifi-将键值对提取到新字段中

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 }

使用Nifi,我尝试使用ReplaceText处理器来提取键值对。 JSON文件的相关部分是“RuleName”:

"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的值中正好有三个“项”,并且不能处理不同数量的“项”

  • 如果JSON文件可能变大,您可以尝试避免使用完整文本计算模式,因为这样会将内容加载到缓冲区,并在文件太大时将流文件路由到故障输出。在这种情况下,我建议您使用所附图像中显示的逐行模式
  • 允许第四个附加值 如果可能有第四个附加值,您可以调整Search value属性中的正则表达式。 您可以将
    (,([^=]+)=([^,]+)?
    添加到上一个表达式中,该表达式大致转换为:

  • ()?
    -将括号中的内容匹配零次或一次
  • -匹配字符逗号
  • ([^=]+)=([^,]+)
    -后跟上文解释的字符组
  • 整个正则表达式将如下所示:

    "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的值中正好有三个“项”,并且不能处理不同数量的“项”

  • 如果JSON文件可能变大,您可以尝试避免使用完整文本计算模式,因为这样会将内容加载到缓冲区,并在文件太大时将流文件路由到故障输出。在这种情况下,我建议您使用所附图像中显示的逐行模式
  • 允许第四个附加值 如果可能有第四个附加值,您可以调整Search value属性中的正则表达式。 您可以将
    (,([^=]+)=([^,]+)?
    添加到上一个表达式中,该表达式大致转换为:

  • ()?
    -将括号中的内容匹配零次或一次
  • -匹配字符逗号
  • ([^=]+)=([^,]+)
    -后跟上文解释的字符组
  • 整个正则表达式将如下所示:

    "RuleName"\s*:\s*"([^=]+)=([^,]+),([^=]+)=([^,]+),([^=]+)=([^,]+)(,([^=]+)=([^,]+))?"
    
    要允许使用新值,还必须调整替换值。 您可以使用大多数NiFi处理器属性中可用的ExpressionL语言来进行d