问题描述
我正在尝试使用正则表达式从Splunk源中提取作业名称,区域。
以下是我的示例来源的格式:
/home/app/abc/logs/20200817/job_DAILY_HR_REPORT_44414_USA_log
使用以下代码,我可以提取工作名称:
(?<logdir>\/[\W\w]+\/[\W\w]+\/)(?<date>[^\/]+)\/job_(?<jobname>.+)_\d+
这是到目前为止的比赛:
Full match 0-53 /home/app/abc/logs/20200817/job_DAILY_HR_REPORT_44414
Group `logdir` 0-19 /home/app/abc/logs/
Group `date` 19-27 20200817
Group `jobname` 32-47 DAILY_HR_REPORT
从源头上我也需要美国(地区)。你能帮忙建议吗。 区域将始终出现在数字字段(44414)之后,该字段的位数可能有所不同。 例如:123、1234、56789
谢谢。
解决方法
您可以使模式更加具体化,因为[\W\w]+
和.+
可以匹配的内容会导致更多的回溯以适应模式的其余部分。
然后对于该区域,您可以在(?<region>[^\W_]+)
的末尾添加一个命名组,该命名组与除下划线以外的任何单词字符匹配一次或多次。
部分
(?<logdir>\/(?:[^\/]+\/)*)(?<date>(?:19|20)\d{2}(?:0?[1-9]|1[012])(?:0[1-9]|[12]\d|3[01]))\/job_(?<jobname>\w+)_\d+_(?<region>[^\W_]+)_log
-
(?<logdir>
组 logdir-
\/(?:[^\/]+\/)*
匹配/
,并可选地重复除/
以外的任何字符,然后再次匹配/
-
-
)
关闭群组 -
(?<date>
组日期-
(?:19|20)\d{2}
匹配从19或20开始的年份 -
(?:0?[1-9]|1[012])
比赛一个月 -
(?:0[1-9]|[12]\d|3[01])
比赛一天
-
-
)
关闭群组 -
\/job_
匹配/job_
-
(?<jobname>\w+)
组职位名称,匹配1个以上的字符char -
_\d+_
在下划线之间匹配1个以上的数字 -
(?<region>[^\W_]+)
组区域匹配单词char的1+次出现,除了_
-
_log
字面上匹配