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

标签 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 循环,如果文件变得非常大,它可能会很慢。

那么,有没有关于标准命令/实用程序的更好建议?

最佳答案

您可以使用以下命令:

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

grep 所需的模式“2016-11-25”

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

要获取上述输出的第一个值,请使用带分隔符“:”的剪切命令

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

关于用于拆分日志文件的 Linux shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40828146/

相关文章:

linux - 系统调用的 debian 手册页

linux - R库不可写

linux - 使用 htaccess .. 所有 url 都必须使用 www 重定向到 https

linux - Bash 输出仅限于回显

shell - 在命令行上将密码传递给 curl

spring - 如何在 Spring Boot 的 application.yml 中配置滚动文件附加程序

c - printf() 是否关心语言环境?

bash - 参数太多 Shell 脚本 if 检查

java - log4j :WARN Please initialize the log4j system properly

java - Log4j 2 根记录器覆盖一切?