【问题标题】:Splunk - regex extract fields from sourceSplunk - 正则表达式从源中提取字段
【发布时间】:2020-08-20 05:05:09
【问题描述】:

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

提前谢谢你。

【问题讨论】:

  • 您的正则表达式似乎非常适合您所取得的成就。为什么你不能以同样的方式开发最后一部分?有什么特殊的障碍让你卡住了吗?你尝试了什么?它是如何失败的?

标签: regex splunk


【解决方案1】:

您可以使模式更具体地说明您允许匹配的内容,因为 [\W\w]+.+ 将导致更多回溯以适应模式的其余部分。

然后对于区域,您可以在末尾添加一个命名组 (?&lt;region&gt;[^\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
  • (?&lt;logdir&gt;logdir
    • \/(?:[^\/]+\/)* 匹配 / 并可选择重复除 / 之外的任何字符,然后再次匹配 /
  • )关闭群
  • (?&lt;date&gt;日期
    • (?:19|20)\d{2} 匹配从 19 或 20 开始的年份
    • (?:0?[1-9]|1[012])匹配一个月
    • (?:0[1-9]|[12]\d|3[01])匹配一天
  • )关闭群
  • \/job_匹配/job_
  • (?&lt;jobname&gt;\w+)jobname,匹配1+字字符
  • _\d+_ 匹配下划线之间的 1+ 个数字
  • (?&lt;region&gt;[^\W_]+) Group region 匹配 1+ 个单词 char 的出现,除了 _
  • _log 字面匹配

Regex demo

【讨论】:

  • 感谢您的详细解释-@第四只鸟。像魅力一样工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
相关资源
最近更新 更多