使用 grok 匹配自定义样式的电子邮件地址
Using grok to match custom style email address
我刚刚为我的 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 过滤器匹配前面有 to=
的电子邮件地址。
我试过了,结果是 "no matches":
(?<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}))*)
您可以使用
\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_sent_to"组:
to=<
- 文字字符串 to=<
[\w.+=:-]+
- 1+ 个单词,.
、+
、=
、:
或 -
个字符
@
- 一个 @
字符
[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 个字母、数字或 -
>
- 一个 >
字符
)
- 小组结束。
这很简单,它创建一个自定义模式来匹配 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}
我刚刚为我的 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 过滤器匹配前面有 to=
的电子邮件地址。
我试过了,结果是 "no matches":
(?<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}))*)
您可以使用
\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_sent_to"组:to=<
- 文字字符串to=<
[\w.+=:-]+
- 1+ 个单词,.
、+
、=
、:
或-
个字符@
- 一个@
字符[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 个字母、数字或-
>
- 一个>
字符
)
- 小组结束。
这很简单,它创建一个自定义模式来匹配 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}