我有一个固定位置(列)文件,其中没有分隔字段的分隔符。每个字段都有自己的起始位置和长度。以下是数据示例:
520140914191193386---------7661705508623855646---1595852965---133437--the lazy fox jumping over-----------------------212.75.12.85---
虽然我用破折号( - )来显示上面数据的样本,但如果实际字段比模式中允许的短,则实际文件包含空格。
这种情况下的架构是:
UsedID (start position 1, length 27)
SystemID (start position 28, length 22)
SampleID (start position 50, length 13)
LineID (start position 63, length 8)
Text (start position 71, length 48)
IP (start position119, length 15)
理想情况下,我会在logstash中获得以下字段值(没有尾随空格)
UsedID:520140914191193386
SystemID:7661705508623855646
SampleID:1595852965
LineID:133437
Text:the lazy fox jumping over
IP:212.75.12.85
如何使用grok解析此类文件?
答案 0 :(得分:9)
我要分两个步骤:
由于每个字段都有已知长度,因此您可以使用.{27}
之类的正则表达式来匹配它们。
在grok中,您可以将字段命名为:(?<user_id>.{27})
您可以在grok debugger中测试完整模式,但是这样的事情应该实现基于长度的分割:
(?<user_id>.{27})(?<system_id>.{22})(?<sample_id>.{13})(?<line_id>.{8})(?<text>.{48})(?<ip>.{15})
您提到您的额外字符都是空格,因此您可以使用mutate filter strip option来清理它。
总之,这可能看起来像这样:
filter {
grok {
match => ["message", "(?<user_id>.{27})(?<system_id>.{22})(?<sample_id>.{13})(?<line_id>.{8})(?<text>.{48})(?<ip>.{15})"]
}
mutate {
strip => [
"user_id",
"system_id",
"sample_id",
"line_id",
"text",
"ip"
]
}
}