我正在尝试使用 Logstash 和 grok 来解析凌乱的 CSV 文件。
我最初使用的是 CSV过滤器,但这意味着我必须首先在预处理中删除一堆标头数据。
理想情况下,由于其简单性,我想再次使用 CSV过滤器。我无法控制 CSV 文件的到达方式。理想情况下,我希望 Logstash 能够处理所有内容而无需任何预处理。
以下是 CSV 文件的示例:
1,2,3,4,5,6,7
"text"
"text"
"01-Jan-2012"
"0123456789"
0,0,0,0,0,0,0,0,0,0
"col1Header",[...],col17Header"
"col1UoM",[...],col17UoM"
01-Jan-2012 11:00:01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
01-Jan-2012 11:00:02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
01-Jan-2012 11:00:03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
01-Jan-2012 11:00:04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
这是我的 Logstash 配置,它会产生评论中显示的错误:
input{
file{
path => ["/opt/docs/*"]
type => "log"
start_position => "beginning"
sincedb_path => "/dev/null"
ignore_older => 0
}
}
filter{
grok{
# error being returned here
# error is: "Expected one of #, {, } at line 27, column 110 (byte 906) after filter{\n\t\n\n\t
# the regex following is to match all the header data that I don't want.
match => {"header_data" => "(?<header_data>[0-9].*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*"\n)"}
} # my plan was to then drop the header_data field (not implemented) and the data would be sent to the csv filter
csv{
columns => ["col17Header",[...],"col17Header]
}
mutate{
convert => {"col2" => "float",[...] => "float","col17" => "float"}
}
date{
match => ["col1","dd-MMM-YYYY HH:mm:ss"]
}
}
output{
elasticsearch{
action => "index"
hosts => ["192.168.1.118:9200"]
index => "foo-logs"
}
}
为清楚起见,这里产生了错误:
&#34;在第27行第110行(字节906)之后的#,{,}中预期的一个 过滤{\ n \吨\ n \ n \吨 #下面的正则表达式是匹配我不想要的所有标题数据。 match =&gt; {&#34; header_data&#34; =&GT; &#34;。。。。。。([0-9]的 \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ N *&#34; \ n)的&#34;}
我想删除底部4行以上的所有数据。我做了(我认为是低效的)正则表达式模式来查找标题和 CSV 数据。
CSV 文件中我需要的只是我示例文件中的最后4行,这是我需要的所有数据。
我的想法是,我目前没有以正确的方式做这件事,所以我对所有建议持开放态度。
答案 0 :(得分:0)
从您的示例中,您想要的行具有唯一的模式:
^%{MONTHDAY}-%{MONTH}-%{YEAR}
了解那种模式。对于不匹配的行,您将获得grokparsefailure,然后可以使用drop {}过滤器忽略它们。