【问题标题】:Extract data with sed command which matches time range and pattern使用匹配时间范围和模式的 sed 命令提取数据
【发布时间】:2020-07-28 10:23:06
【问题描述】:

我想从一个大的日志文件(大约 10GB)中提取行并将数据复制到一个单独的文件中。 输出应与给定的时间范围和给定的文本匹配。

我尝试了以下仅与时间范围匹配的命令,但整个内容正在复制到文件中而没有过滤。 (然后我想 grep 给定的文本表单 mycopy 文件。)

sed '/2020-07-21 17:28:00/,/2020-07-21 17:44:00/w mycopy' myLogFile  > mycopy

如果我可以同时包含要匹配的文本,那就更好了,但我不明白该怎么做。 我想要类似的东西。

sed '/givenTextTobeMatched/2020-07-21 17:28:00/,/2020-07-21 17:44:00/' myLogFile > mycopy

您对此的回应非常感谢。

【问题讨论】:

  • 您能否添加示例输入和预期输出。
  • @tripleee 非常感谢,您提供的命令对我有用。这正是我所需要的。如果您可以提供它作为答案,我可以接受。
  • 我删除了 cmets 并发布了一个答案,稍微扩大了一点。

标签: linux logging sed grep


【解决方案1】:

仅当开始时间和结束时间都出现在日志文件中时,使用正则表达式来识别时间范围才有效。如果在 17:44:00 没有记录任何内容,则 sed 将复制文件的整个其余部分,因为永远不会满足结束条件。如果您不能保证每秒都有日志事件,可能会切换到更高级别的语言,例如 Awk。

语法

sed '/2020-07-21 17:28:00/,/2020-07-21 17:44:00/!d;/givenTextTobeMatched/!d' myLogFile

会按照你的要求去做。注意否定;首先,我们删除范围之外的行,而不是那些 匹配模式的行。 (某种意义上的

sed -n '/2020-07-21 17:28:00/,/2020-07-21 17:44:00/{
    /givenTextTobeMatched/p
}' myLogFile

可能更惯用和合乎逻辑,但更难便携地挤在一条线上。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多