我有一些数据库信息被提取到临时日志中。我需要编写一个正则表达式来解析它,以便可以将其输入到分析程序中。我需要将每个“字段”分组如下:
我几乎有正则表达式,但是在分组字段时遇到了问题。具体来说,名字和姓氏。理想情况下,我希望将它们捕获到两个字段中(如果存在引号,则将其删除),但是将FirstName和LastName合并为一个也可以。
当前正则表达式的问题是,尽管将FirstName和LastName分组为一个字段(不理想,但可以接受),但是似乎还有一个额外的字段捕获了一个空格。
这是我要到达的正则表达式:
^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+(\S+)\.(\S+)\s+(\S+)\s+(\d{4}-\d{2}-\d{2}:\s\d{2}:\d{2}:\d{2})\s+(.*?)\s+(.*?)\s+(.*?)\s+(?<!")(.*)(?!")\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)$
以下是一些示例事件:
2016-01-29 18:19:54 local1.info server.domain.com 2016-01-29: 11:19:54 MST UNKNOWN UNKNOWN FOO "BAR BAZ" UNKNOWN UNKNOWN UNKNOWN [email protected] PROFILE_CHANGE ProfileChangeProcessor A
2016-01-29 18:20:25 local4.info server.domain.com 2016-01-29: 11:20:25 MST UNKNOWN UNKNOWN "F B" BAZ ABC12345 GP SOME_UID [email protected] EVENT_FROM_SOME_PROCESS UNKNOWN UNKNOWN
2016-01-29 18:23:10 local1.info server.domain.com 2016-01-29: 11:23:10 MST UNKNOWN UNKNOWN FOO BAR UNKNOWN UNKNOWN UNKNOWN [email protected] SOME_CHANGE ProfileChangeProcessor AP
2016-01-29 18:26:24 local1.info server.domain.com 2016-01-29: 11:26:24 MST UNKNOWN [email protected] FOO "B'Baz" UNKNOWN UNKNOWN UNKNOWN SOME_CHANGE ProfileChangeProcessor O
2016-01-29 18:26:55 local1.info server.domain.com 2016-01-29: 11:26:55 MST UNKNOWN [email protected] "FOO OR BAR" BAZ SXR12646 GP UNKNOWN SOME_CHANGE ProfileChangeProcessor M
这是我通过Perl内联表达式运行它时的输出:
$ cat foo.txt | perl -ne '/^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+(\S+)\.(\S+)\s+(\S+)\s+(\d{4}-\d{2}-\d{2}:\s\d{2}:\d{2}:\d{2})\s+(.*?)\s+(.*?)\s+(.*?)\s+(?<!")(.*)(?!")\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)$/ && print "$1|$2|$3|$4|$5|$6|$7|$8|$9|$10|$11|$12|$13|$14|$15|$16|\n"'
2016-01-29 18:19:54|local1|info|server.domain.com|2016-01-29: 11:19:54|MST|UNKNOWN|UNKNOWN|FOO "BAR BAZ"|UNKNOWN|UNKNOWN|UNKNOWN|[email protected]|PROFILE_CHANGE|ProfileChangeProcessor|A|
2016-01-29 18:20:25|local4|info|server.domain.com|2016-01-29: 11:20:25|MST|UNKNOWN|UNKNOWN|"F B" BAZ|ABC12345|GP|SOME_UID|[email protected]|EVENT_FROM_SOME_PROCESS|UNKNOWN|UNKNOWN|
2016-01-29 18:23:10|local1|info|server.domain.com|2016-01-29: 11:23:10|MST|UNKNOWN|UNKNOWN|FOO BAR|UNKNOWN|UNKNOWN|UNKNOWN|[email protected]|SOME_CHANGE|ProfileChangeProcessor|AP|
2016-01-29 18:26:24|local1|info|server.domain.com|2016-01-29: 11:26:24|MST|UNKNOWN|[email protected]|FOO "B'Baz"|UNKNOWN|UNKNOWN|UNKNOWN||SOME_CHANGE|ProfileChangeProcessor|O|
2016-01-29 18:26:55|local1|info|server.domain.com|2016-01-29: 11:26:55|MST|UNKNOWN|[email protected]|"FOO OR BAR" BAZ|SXR12646|GP|UNKNOWN||SOME_CHANGE|ProfileChangeProcessor|M|
使用上述正则表达式时的当前问题位于最后两个记录中。在分组#13处,有一个空字段。我不确定该如何解决。如果我无法获得带有输出数据的字段,则无法将其正确加载到分析引擎中。总体而言,我正在寻找是否有更好的方法根据我概述的内容对字段进行分组,并确保不存在空格(或类似字符)的分组。
这是我要做的:
^\s*
# date
(?<date>\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})
# facility.severity
\s(?<facility>\S+)\.(?<severity>\S+)
# server
\s(?<server>\S*)
# date
\s(?<otherDate>\d{4}-\d{2}-\d{2}:\s\d{2}:\d{2}:\d{2})
# time zone
\s(?<timeZone>\S*)
# ip address
\s(?<ip>\S*)
# legacy email address
\s(?<legacyEmailAddress>\S*)
# first name
\s(?|"(?<firstName>[^"\n]+)"|(?<firstName>\S*))
# last name
\s(?|"(?<lastName>[^"\n]+)"|(?<lastName>\S*))
# account number
\s(?<account>\S*)
# program code
\s(?<programCode>\S*)
# uid
\s(?<uid>\S*)
# email address
\s(?<emailAddress>\S*)
# event type
\s(?<eventType>\S*)
# source
\s(?<source>\S*)
# category
\s(?<category>\S*)
\s*$
x
修饰符,以便可以将空格放入表达式中$13
是什么意思 为您的捕获组命名,这样更好。\S*
,这完全由您决定(?|"(?<name>[^"\n]+)"|(?<name>\S*))
(?|
...)
是分支重置组。它使您可以在每个替代方案中重复使用相同的捕获组编号或名称"(?<name>[^"\n]+)"
捕获引号(?<name>\S*)
捕获一个不带引号的名称...其中只有一个可以匹配,并且它们将属于同一捕获组。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句