Logstash - CSV列的子字符串

时间:2015-04-30 04:34:09

标签: csv filter elasticsearch substring logstash

我想将CSV文件中的许多信息导入Elastic Search。 我的问题是,我不知道如何使用等效的子字符串来选择CSV列中的信息。

在我的情况下,我有一个字段日期(YYYYMMDD),我想要(YYYY-MM-DD)。

我使用filter,mutate,gsub之类的:

filter 
{
  mutate 
  {
    gsub => ["date", "[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]", "[0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]"]
  }
}

但我的结果是假的。 我可以识别我的字符串,但我不知道如何提取部分内容。

我的目标是:

gsub => ["date", "[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]","%{date}(0..3}-%{date}(4..5)-%{date}"(6..7)]

%{date}(0..3}:从csv列的第一个到第4个字符中选择日期

2 个答案:

答案 0 :(得分:2)

您可以使用ruby插件进行转换。如你所说,你将有一个date字段。因此,我们可以直接在ruby

中使用它
filter {
    ruby {
        code => "
                date = Time.strptime(event['date'],'%Y%m%d')
                event['date_new'] = date.strftime('%Y-%m-%d')
        "
    }
}

date_new字段是您想要的格式。

答案 1 :(得分:1)

首先,您可以使用正则表达式范围来匹配序列,因此您可以执行[0-9]而不是[0123456789]。如果你知道会有4个号码,你可以[0-9] {4}。

其次,您希望“捕获”输入字符串的一部分并在输出中重新排序。为此,您需要捕获组:

([0-9]{4})([0-9]{2})([0-9]{2})

parens定义组。然后你可以参考gsub右侧的那些:

\1-\2-\3

\ 1是第一个捕获组等。

您可能还会考虑在执行grok {}时获取这三个字段,然后再将它们放在一起(可能使用add_field)。