[SHELL] 获取某段时间的日志

2022-11-16 13:30:56 浏览数 (2)

需求

其实这个需求并不常见, 有的时候需要截取部分日志, 一般使用tail即可.

但有时候, 需要取某个时间之后的日志给其他人(比如原厂商)分析, 这种时候往往只需要问题发生的时候的日志即可.

实现方式

主要就是使用 grep, sed, awk, tail之类的常用命令.

下面的演示就使用Mysql的日志了.

建议重定向到其它文件. 本文为了方便演示就不重定向了.

方法1 grep

-A, --after-context=NUM print NUM lines of trailing context

-B, --before-context=NUM print NUM lines of leading context

例子:

-A 10 是打印匹配行及其之后的10行

代码语言:javascript复制
grep '^2022-11-14T09' -A 10 /data/mysql_3308/mysqllog/dblogs/mysql3308.err

可以使用 | grep -B 'xxx' 这样就能获取某段时间的了, 这里就不演示了

方法2 sed

代码语言:javascript复制
eval sed -n '/^2022-11-14T09/,$p' /data/mysql_3308/mysqllog/dblogs/mysql3308.err

sed 并不常用, 一般用sed来操作文件内容..... 就不多介绍了.

方法3 awk

使用 if 判断时间是否符合要求, 并打印符合要求的行

~ 是 like 操作符

$0 表示整行

代码语言:javascript复制
awk '{if ($1 ~ "2022-11-14") print $0}' /data/mysql_3308/mysqllog/dblogs/mysql3308.err

当然你可以再加个条件 比如 $3=="[ERROR]"

代码语言:javascript复制
awk '{if (($1 ~ "2022-11-14") && ($3=="[ERROR]")) print $0}' /data/mysql_3308/mysqllog/dblogs/mysql3308.err

方法4 tail

tail就比较好理解了, 就是查看最后N行. 搭配grep使用效果更佳

grep匹配出起始行, tail 从起始行开始打印

grep -m 1 是只打印第一次匹配的内容.

tail -n 110440 意思是从 110440 行开始打印

代码语言:javascript复制
grep -m 1 -n '^2022-11-14' /data/mysql_3308/mysqllog/dblogs/mysql3308.err
tail -n  110440 /data/mysql_3308/mysqllog/dblogs/mysql3308.err

0 人点赞