首页 > 解决方案 > 使用匹配时间范围和模式的 sed 命令提取数据

问题描述

我想从一个大的日志文件(大约 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

你对此的回应真的很感激。

标签: linuxloggingsedgrep

解决方案


仅当开始时间和结束时间都出现在日志文件中时,使用正则表达式来识别时间范围才有效。如果在 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

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


推荐阅读