2017-04-17 104 views
1

这些天我会学习正则表达式。如何使用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.请帮忙吗?谢谢!

+0

为什么不使用'[^ ​​ - ] +'作为能力? – kennytm

+0

@Chris:如果结果对你有用,请考虑upvoting答案。 –

回答

0

这是因为你不能否定序列与否定字符类的符号。 [^(0-9\.0-9\.0-9)]匹配除(之外的任何单个字符,数字,.)

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

enter image description here

现在,(?<capability>.*?)-\d{2}\.\d{2}\.\d{2}将匹配任何字符0+(和他们捕捉到“能力”组)尽可能少(因为*?是一个懒惰的量词)到第一发生-,然后是2个数字,然后是3个点(\.)的序列后跟2个数字。

请参阅regex demo regex101.com。