用于拆分日志文件的Linux shell命令

时间:2016-11-27 10:58:24

标签: linux shell logging split

我想知道是否有更好的方法来拆分日志文本文件而不是执行下面的shell循环,理想情况下使用单个shell命令。

日志文件如下所示:

2016-11-20T16:19:21+00:00 Logging started
2016-11-20T16:20:41+00:00 System is up
2016-11-20T16:21:07+00:00 Unknown event 45
...
2016-11-25T08:40:00+00:00 Blah blah
2016-11-25T08:42:00+00:00 Blah blah
...
2016-11-27T11:32:00+00:00 System powering down
  • 所有行都以ISO8601日期标记(UTC)
  • 开头
  • 这些行按时间顺序构建,因为当有事件要记录时会附加行。
  • 文件正在增长

因此,我们要完成的任务是在给定时间拆分文件。 假设我只保留上周的条目,以避免不断增长的综合症。

因此,日期为“2016-11-25T08:41:00 + 00:00”,我希望仅保留该日期之后的那些条目。 请注意,我们要剪切文件的日期不一定与现有条目相对应(如示例中所示)。

所以,我能做的最好的事情是这样的一段代码:

WHEN='2016-11-25T08:41:00+00:00' # actually that is read as a parameter

while read line; do
  if [ "${line}" \> "${WHEN}" ]; then
    echo "${line}"
  fi
done <"${LOGFILE}" >"${CUTFILE}"

这样可行,但由于它是一个shell循环,如果文件变得非常大,它可能会很慢。

那么,使用标准命令/实用程序有什么更好的建议吗?

1 个答案:

答案 0 :(得分:3)

您可以使用以下命令:

tail -n +$(cat logfile | grep -m1 -n "2016-11-25" | cut -d: -f1) logfile 
grep的

-m1选项将匹配模式的第一次出现(2016-11-25),-n将打印相应的行号以及匹配的模式。

例如来自上面的日志文件

root@ubuntu:/home# cat logfile 
2016-11-20T16:19:21+00:00 Logging started
2016-11-20T16:20:41+00:00 System is up
2016-11-20T16:21:07+00:00 Unknown event 45
2016-11-25T08:40:00+00:00 Blah blah
2016-11-25T08:39:02+00:00 Blah blah
2016-11-25T08:39:04+00:00 Blah blah
2016-11-25T08:42:00+00:00 Blah blah
2016-11-27T11:32:00+00:00 System powering down

点击所需的模式“2016-11-25”

root@ubuntu:/home# cat logfile | grep -m1 -n "2016-11-25"
4:2016-11-25T08:40:00+00:00 Blah blah

取上述输出的第一个值使用cut命令和分隔符“:”

root@ubuntu:/home# cat logfile | grep -m1 -n "2016-11-25" | cut -d: -f1
4

并将其传递给tail命令,“tail -n +”以获取所需的输出

root@ubuntu:/home# tail -n +$(cat logfile | grep -m1 -n "2016-11-25" | cut -d: -f1) logfile
2016-11-25T08:40:00+00:00 Blah blah
2016-11-25T08:39:02+00:00 Blah blah
2016-11-25T08:39:04+00:00 Blah blah
2016-11-25T08:42:00+00:00 Blah blah
2016-11-27T11:32:00+00:00 System powering down