代码之家  ›  专栏  ›  技术社区  ›  A. Kendall

使用grok匹配自定义样式的电子邮件地址

  •  2
  • A. Kendall  · 技术社区  · 8 年前

    我刚刚为我的apache日志设置了一个ELK堆栈。它工作得很好。现在我想将邮件日志添加到混合中,但我在用grok解析日志时遇到了问题。

    我正在使用此网站调试: https://grokdebug.herokuapp.com/

    下面是一个示例邮件日志(sendmail)条目:

    Apr 24 19:38:51 ip-10-0-1-204 sendmail[9489]: w3OJco1s009487: to=<username@domain.us>, delay=00:00:01, xdelay=00:00:01, mailer=smtp, pri=120318, relay=webmx.bglen.net. [10.0.3.231], dsn=2.0.0, stat=Sent (Ok: queued as E2DEF60724), w3OJco1s009487: to=<username@domain.us>, delay=00:00:01, xdelay=00:00:01, mailer=smtp, pri=120318, relay=webmx.[redacted].net. [10.0.3.231], dsn=2.0.0, stat=Sent (Ok: queued as E2DEF60724)
    

    从上面的文本中,我想拉出文本 to=<username@domain.us>

    到目前为止,我有一个grok模式:

    (?<mail_sent_to>[a-zA-Z0-9_.+=:-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.(?:[0-9A-Za-z][0-‌​9A-Za-z-]{0,62}))*)
    

    它给了我结果 username@domain.us> 这很好,但我希望它有 to= 前面也是。我只想让这个grok筛选器匹配 至= 在他们面前。

    我试过这个,但结果是“没有匹配项”:

    (?<mail_sent_to>"to="[a-zA-Z0-9_.+=:-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.(?:[0-9A-Za-z][0-‌​9A-Za-z-]{0,62}))*)
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Wiktor Stribiżew    8 年前

    您可以使用

    \b(?<mail_sent_to>to=<[a-zA-Z0-9_.+=:-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.[0-9A-Za-z][0-9A-Za-z-]{0,62})*>)
    

    或者,自 [a-zA-Z0-9_] 匹配与相同的字符 \w :

    \b(?<mail_sent_to>to=<[\w.+=:-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.[0-9A-Za-z][0-9A-Za-z-]{0,62})*>)
    

    请参见 regex demo

    详细信息

    • \b -单词边界
    • (?<mail_sent_to> -“mail\u sent\u to”组:
      • to=< -文字字符串 至=<
      • [\w.+=:-]+ -1+字, . ,则, + ,则, = ,则, : - chars公司
      • @ -a @ 烧焦
      • [0-9A-Za-z] -字母数字字符
      • [0-9A-Za-z-]{0,62} -0至62个字母、数字或 -
      • (?:\.[0-9A-Za-z][0-9A-Za-z-]{0,62})* -0+序列
        • \. -一个圆点
        • [0-9A-Za-z] -字母数字字符
        • [0-9A-Za-z-]{0,62} -0至62个字母、数字或 -
      • > -a > 烧焦
    • ) -组结束。
        2
  •  2
  •   Sufiyan Ghori    8 年前

    这非常简单,它可以创建一个自定义模式来匹配 to=< > pre-defined EMAILADDRESS 匹配电子邮件地址。

    \b(?<mail_sent_to>to=<%{EMAILADDRESS}>)
    

    这将输出,

    {
      "mail_sent_to": [
        [
          "to=<username@domain.us>"
        ]
      ],
      "EMAILADDRESS": [
        [
          "username@domain.us"
        ]
      ],
      "EMAILLOCALPART": [
        [
          "username"
        ]
      ],
      "HOSTNAME": [
        [
          "domain.us"
        ]
      ]
    }
    

    编辑:

    电子邮件的模式有,

    EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+
    EMAILADDRESS %{EMAILLOCALPART}@%{HOSTNAME}