【问题标题】:Logstash - Substring from CSV columnLogstash - 来自 CSV 列的子字符串
【发布时间】:2015-04-30 04:34:08
【问题描述】:

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

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

我使用过滤器、变异、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 个字符中选择

【问题讨论】:

    标签: csv filter elasticsearch substring logstash


    【解决方案1】:

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

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

    date_new 字段是您想要的格式。

    【讨论】:

      【解决方案2】:

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

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

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

      其中括号定义组。然后您可以参考 gsub 右侧的那些:

      \1-\2-\3
      

      \1 是第一个捕获组,以此类推

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 2013-01-01
        相关资源
        最近更新 更多