如何使用 Logstash Grok 拆分文件名?

How do I split a filename using Logstash Grok?

总有一天我会学习正则表达式。

我有以下文件名

PE-run1000hbgmm3f1-job1000hbgmm3dt-Output-Workflow-1000hbgmm3fb-22.07.17.log

我能够让它工作所以...

(?<logtype>[^-]+)-(?<run_id>[^-]+)-(?<job_id>[^-]+)-(?<capability>[^(0-9\.0-9\.0-9)]+)

logtype: PE
run_id: run1000hbgmm3f1
job_id: job1000hbgmm3dt

但是我得到了

capability: Output-Workflow-

...虽然我希望它是

capability: Output-Workflow-1000hbgmm3fb

...即 job_id 之后到时间戳 HH.mm.ss 的所有文本。有什么帮助吗?谢谢!

这是因为您不能用否定字符 class 否定符号的 序列 [^(0-9\.0-9\.0-9)] 匹配 (、数字、.) 以外的任何单个字符。

您可以将 (?<capability>[^(0-9\.0-9\.0-9)]+) 替换为 (?<capability>.*?)-\d{2}\.\d{2}\.\d{2} 以获得正确的值。

现在,(?<capability>.*?)-\d{2}\.\d{2}\.\d{2} 将匹配任何 0+ 个字符(并将它们捕获到 "capability" 组中)尽可能少(因为 *? 是惰性量词)最多第一个 出现 -,后跟 2 个数字,然后是 3 个点序列 (\.),后跟 2 个数字。

请参阅 regex101.com 处的 regex demo