elasticsearch 如何删除Logstash中CSV的前几行,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch 如何删除Logstash中CSV的前几行,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch 如何删除Logstash中CSV的前几行

elasticsearch 如何删除Logstash中CSV的前几行,elasticsearch,logstash,elasticsearch,Logstash,这是我用于logstash的输入 ItemId,AssetId,ItemName,Comment 11111,07,ABCDa,XYZa 11112,07,ABCDb,XYZb 11113,07,ABCDc,XYZc 11114,07,ABCDd,XYZd 11115,07,ABCDe,XYZe 11116,07,ABCDf,XYZf 11117,07,ABCDg,XYZg Date,Time,Mill Sec,rows,columns 19-05-2020,13:03:46,534,2,2 1

这是我用于logstash的输入

ItemId,AssetId,ItemName,Comment
11111,07,ABCDa,XYZa
11112,07,ABCDb,XYZb
11113,07,ABCDc,XYZc
11114,07,ABCDd,XYZd
11115,07,ABCDe,XYZe
11116,07,ABCDf,XYZf
11117,07,ABCDg,XYZg
Date,Time,Mill Sec,rows,columns
19-05-2020,13:03:46,534,2,2
19-05-2020,13:03:46,539,2,2
19-05-2020,13:03:46,544,2,2
19-05-2020,13:03:46,549,2,2
19-05-2020,13:03:46,554,2,2

我需要从csv中删除前8行,将下一行作为列标题,并像往常一样解析其余的行。有没有办法在logstash中这样做?

您的内容不是CSV格式。您的任务是将其转换为真正的CSV格式。

您的内容不是CSV格式。您的任务是将其转换为真正的CSV格式。

您应该在文件进入日志存储之前执行此操作。在Logstash中有很多方法可以做到这一点,例如使用
mutliline
code,然后执行奇异的
grok
匹配以删除前N行(或删除行直到特定的正则表达式),然后执行
split
然后执行普通的ol'
csv
过滤器。对于标题行,您需要比平常更加小心。真是一团糟

最好在Logstash前面放一些东西来处理这个问题

如果文件是logstash实例的本地文件,则可以使用来处理异常情况

输入{
执行官{
command=>“/path/to/command_或_script”#sh或py或js等
间隔=>60
}
}
在Linux上,此
命令将从…上的第8行打印一个文件

     command => "tail +8 /path/to/file"
这一行(同样适用于Linux)将删除所有内容,直到以
日期开始的一行,然后打印所有内容

    command => "sed -n -e '/^date/,$p' /path/to/file"
通过在脚本中删除或归档同一文件(而不是这些示例中使用的一行程序),可以避免重复读取同一文件

修剪不需要的前导行后,您应该能够以正常方式使用
csv
过滤器


请注意,如果要
自动检测列名称
,则必须将管道工作线程设置为1。

您应该在文件进入日志存储之前执行此操作。在Logstash中有很多方法可以做到这一点,例如使用
mutliline
code,然后执行奇异的
grok
匹配以删除前N行(或删除行直到特定的正则表达式),然后执行
split
然后执行普通的ol'
csv
过滤器。对于标题行,您需要比平常更加小心。真是一团糟

最好在Logstash前面放一些东西来处理这个问题

如果文件是logstash实例的本地文件,则可以使用来处理异常情况

输入{
执行官{
command=>“/path/to/command_或_script”#sh或py或js等
间隔=>60
}
}
在Linux上,此
命令将从…上的第8行打印一个文件

     command => "tail +8 /path/to/file"
这一行(同样适用于Linux)将删除所有内容,直到以
日期开始的一行,然后打印所有内容

    command => "sed -n -e '/^date/,$p' /path/to/file"
通过在脚本中删除或归档同一文件(而不是这些示例中使用的一行程序),可以避免重复读取同一文件

修剪不需要的前导行后,您应该能够以正常方式使用
csv
过滤器


请注意,如果您想
自动检测列名称
,则必须将管道工作者设置为1。

您可以使用文件输入执行此操作,然后使用grok逐行读取,以确保它具有正确数量的逗号分隔字段,并忽略标题

您的输入将如下所示:

input { 
  file {
    path => "/path/to/my.csv"
    start_position => beginning
  }
}
filter {
  grok {
    match => { "message" => [
      "^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
      ]
    }
  }
}
{
  "colums": "2",
  "Time": "13:03:46",
  "Mill_Sec": "554",
  "rows": "2",
  "Date": "19-05-2020"
}
output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch {
      ...
    }
  }
}
这将把每一行读取到一个事件中,其中包含名为message的字段中的数据,然后将其发送到过滤器。 在过滤器中,您将使用具有如下模式的grok:

input { 
  file {
    path => "/path/to/my.csv"
    start_position => beginning
  }
}
filter {
  grok {
    match => { "message" => [
      "^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
      ]
    }
  }
}
{
  "colums": "2",
  "Time": "13:03:46",
  "Mill_Sec": "554",
  "rows": "2",
  "Date": "19-05-2020"
}
output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch {
      ...
    }
  }
}
这会将每一行显示为如下所示的事件:

input { 
  file {
    path => "/path/to/my.csv"
    start_position => beginning
  }
}
filter {
  grok {
    match => { "message" => [
      "^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
      ]
    }
  }
}
{
  "colums": "2",
  "Time": "13:03:46",
  "Mill_Sec": "554",
  "rows": "2",
  "Date": "19-05-2020"
}
output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch {
      ...
    }
  }
}
在转到输出部分之前,可以使用mutate删除不需要的字段(如message)。如果与定义的模式不匹配,您将得到一个标签,标签中的值为
\u grokparsefailure
,您可以使用该值决定是否将其发送到输出。正如您定义的,它必须是数字,它也会在标题1上失败,因此只留下“真实”事件

这可以通过如下方式定义输出来实现:

input { 
  file {
    path => "/path/to/my.csv"
    start_position => beginning
  }
}
filter {
  grok {
    match => { "message" => [
      "^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
      ]
    }
  }
}
{
  "colums": "2",
  "Time": "13:03:46",
  "Mill_Sec": "554",
  "rows": "2",
  "Date": "19-05-2020"
}
output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch {
      ...
    }
  }
}

您可以使用文件输入来执行此操作,然后使用grok逐行读取它,以确保它具有正确数量的逗号分隔字段,并忽略标题字段

您的输入将如下所示:

input { 
  file {
    path => "/path/to/my.csv"
    start_position => beginning
  }
}
filter {
  grok {
    match => { "message" => [
      "^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
      ]
    }
  }
}
{
  "colums": "2",
  "Time": "13:03:46",
  "Mill_Sec": "554",
  "rows": "2",
  "Date": "19-05-2020"
}
output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch {
      ...
    }
  }
}
这将把每一行读取到一个事件中,其中包含名为message的字段中的数据,然后将其发送到过滤器。 在过滤器中,您将使用具有如下模式的grok:

input { 
  file {
    path => "/path/to/my.csv"
    start_position => beginning
  }
}
filter {
  grok {
    match => { "message" => [
      "^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
      ]
    }
  }
}
{
  "colums": "2",
  "Time": "13:03:46",
  "Mill_Sec": "554",
  "rows": "2",
  "Date": "19-05-2020"
}
output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch {
      ...
    }
  }
}
这会将每一行显示为如下所示的事件:

input { 
  file {
    path => "/path/to/my.csv"
    start_position => beginning
  }
}
filter {
  grok {
    match => { "message" => [
      "^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
      ]
    }
  }
}
{
  "colums": "2",
  "Time": "13:03:46",
  "Mill_Sec": "554",
  "rows": "2",
  "Date": "19-05-2020"
}
output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch {
      ...
    }
  }
}
在转到输出部分之前,可以使用mutate删除不需要的字段(如message)。如果与定义的模式不匹配,您将得到一个标签,标签中的值为
\u grokparsefailure
,您可以使用该值决定是否将其发送到输出。正如您定义的,它必须是数字,它也会在标题1上失败,因此只留下“真实”事件

这可以通过如下方式定义输出来实现:

input { 
  file {
    path => "/path/to/my.csv"
    start_position => beginning
  }
}
filter {
  grok {
    match => { "message" => [
      "^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
      ]
    }
  }
}
{
  "colums": "2",
  "Time": "13:03:46",
  "Mill_Sec": "554",
  "rows": "2",
  "Date": "19-05-2020"
}
output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch {
      ...
    }
  }
}

我已将其更改为csv。如果您知道解决方案,请回复。我的意思是CSV在顶行只有一个标题行。您的内容有两个标题行。我检查了参数列表,没有人为您服务:忽略第一个标题行,您是否可以跳过其余7行,然后在logstash中将该行作为列标题?我已将其更改为csv。如果您知道解决方案,请回复。我的意思是CSV在顶行只有一个标题行。您的内容有两个标题行。我检查了参数列表,没有人为您服务:忽略第一个标题行,你能跳过剩下的7行,并在logstash中将其后的行作为列标题吗?你能提供在logstash中执行第一段中提到的流程代码吗?你能提供在logstash中执行第一段中提到的流程代码吗?请提供流程代码。用snippets更新我的答案吗在标题的
grok
match
过滤器中提及每个字段,或者只有第一个类似日期的字段适用于整行?