【问题标题】:extract records between given start and end time from multiple log files从多个日志文件中提取给定开始和结束时间之间的记录
【发布时间】:2018-06-03 15:10:44
【问题描述】:

我们的日志文件将包含数百万条格式的记录:

xyz,xyz,YYYY-MM-DD HH:MM:SS,....,

我们将得到格式为 YYYYMMDDHHMMSS 的开始时间和结束时间作为 shellscript 的输入。 我们想从时间戳在开始时间和结束时间之间的所有日志文件中提取记录。

日志中的单条记录:abc,def,ghi,2018-06-03 11:00:00,...,xyz

包装脚本:xyz.sh '20180603112000' '20180604120000'

预期输出:给定两个时间戳之间的所有记录。

【问题讨论】:

  • 欢迎来到 SO,请在您的帖子中添加输入和预期输出示例以及代码标签以及您的努力(您为满足您的要求所做的努力)

标签: bash shell awk sed grep


【解决方案1】:
#!/bin/sh

d4="([0-9]{4})"
d2="([0-9]{2})"
pattern="$d4$d2$d2$d2$d2$d2"
replace='\1-\2-\3 \4:\5:\6'
from=$(echo "$1" | sed -r "s/$pattern/$replace/")
to=$(echo "$2" | sed -r "s/$pattern/$replace/")

sed -n "/$from/,\$p;/$to/q" file

在简单的英语中,它包括 $from 的第一个匹配项和匹配 $to 的第一行。

具体来说,脚本首先将输入转换为文件中预期出现的时间戳。然后 sed 默认不打印 (-n) 迭代文件,但打印从第一行到最后一行 ($) 的所有内容,但是如果遇到 $to,sed 将退出。

虽然这个解决方案并不完美。它的工作假设是每一秒至少包含一个日志行。或者至少搜索的秒数。通常,您不需要按秒提取日志行,我建议按小时或分钟提取块。当然,除非你有大量的日志行,在这种情况下,我认为这个假设成立。其次,它假设日志行中的数据不包含任何时间戳。如果数据本身包含时间戳,则此功能可能会中断。

更新: 我不太喜欢我给出的解决方案,因为它只打印与 $to 匹配的第一行。 它很容易制作,但可能不是你想要的。 这是一个在匹配 $to 的第一行之前停止的解决方案:

sed -n "/$from/,\$p" file | sed "/$to/Q"

你可以通过一个 sed 调用来做到这一点,但它有点难以理解:

sed -n "/$from/,\${/$to/Q;p}" file

这是一个包含所有匹配 $to 的行的解决方案

sed -n "/$from/,\$p" file | sed "/$to/{/$to/{N};q}"

新部分说明:Q会在自动打印前退出, 但由于我使用 p 进行打印,我必须确保 Q 在 p /$to/Q;p 之前触发, 或使用单独的 sed 调用以获得更易于理解的解决方案。

第二种解决方案只是自动打印,直到遇到 $to /$to/。 然后它将每个匹配 $to 的后续行附加到 patspace /$to/{N}。 最后的 q 打印 patspace 并退出 sed。

【讨论】:

  • 感谢@Erik Lievaart,感谢您的第一篇和更新的帖子 :) 我们将根据小时和分钟提取数据块,并且为了更新您,日志行中不会有任何包含时间戳的数据除了我们匹配的字段。
  • 这种方法有一个问题,如果没有时间戳匹配输入开始时间,它就不起作用。
  • 没错,这就是我建议按小时(或分钟)过滤的原因。这将使这种情况不太可能发生。如果您想要一个万无一失的解决方案,那么 sed 可能不是这项工作的工具(因为您需要解释时间戳,而不是进行简单的文本匹配)。在这种情况下,我建议使用成熟的编程语言。但是,您将在准确性和性能之间进行权衡。 sed 解决方案非常高效。
  • 啊,我才意识到我的意图可能不像我想象的那么清楚。进一步澄清:如果您调整脚本以使秒(或可能分钟)不属于 sed 过滤的表达式的一部分,那么只要有与起始分钟(或小时)匹配的日志记录,过滤就会起作用。由于表达式当前一直定义到秒,因此需要有一个精确到秒的日志记录。降低 sed 表达式的精度大大提高了该解决方案的可用性。
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2016-07-22
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
相关资源
最近更新 更多