Splunk-正则表达式从源中提取字段

问题描述

我正在尝试使用正则表达式从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字面上匹配

Regex demo

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...