需求
其实这个需求并不常见, 有的时候需要截取部分日志, 一般使用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]"
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