如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。[更多文章在我博客] coderdao.github.io/
场景
今天隔离还在继续,在家办公。忽然下午午工作群里发来一个 mysql
机器io/负载上升的预警,异常发生在 15:45 ~ 16:00
之间。为了事后为了查明原因,需要翻看慢查询日志 slow.log
才发现日志 8G 多… 故事就这样开始了
前言
前文 总结过 grep
方法 处理大文件的时候
:grep 检索一次的时间消耗高
、多行内容难以匹配多个关键字
等困难。实在是难受啊,怎么办呢
转变思路
实在是难受啊,怎么办呢?
用后端处理大量数据的思路:就是把数据不断地细分,削峰填谷用时间换空间
。
简单理解:既然文件大,一次处理不方便。就把文件不断细分、切成好几份。一次处理一份。处理的次数多了,但平均每次处理的数据量更小、时间更少、更迅速
。体验也更好
思路 split 切分文件
split 是 linux 常用的 文件切分方法
。它支持按行、大小等方式进行切分。
split命令的语法如下:split [-a ][-b][-C ][-l ][被切割文件路径][输出文件名前缀]
具体参数如下:
切分大文件
下面举几个例子:
文件大小切割
将 slow3306_9105.log
文件 按文件大小(每个文件 10m)分割成多个文件
$ split -b 10m slow3306_9105.log
$ ls
slow3306_9105.log xaa xab xac xad xae
设定输出文件名
上面看起来 xaa xab xac xad xae
就是输出文件,但并不直观。
所以还能对输出文件名进行设定
$ split -d -b 10m slow3306_9105.log slow.log
$ ls
slow3306_9105.log slow.log00 slow.log01 slow.log02 slow.log03 slow.log04
文件行数切割
将 slow3306_9105.log
文件 按 行数(每个文件 5w 行)分割成多个文件
输出文件保持 log
文件后缀
生成后文件名都是 .log0*
,生成的后缀被追加到最后影响文件格式。而需要.log
文件结尾的话,可以使用下面命令 将分割后的文件序号调整至文件名后
,不影响文件后缀:
for i in `ls|grep slow`; do a=`echo $i|awk -F '.log' '{print $1$2".log"}'`; mv $i $a; done
后悔药:日志合并
如果你切着切着把文件且太细了(不是一般人)。那么附带记录一个 多个文件合并的方法
:cat 命令
将切分后文件 重新合并 为同一文件:$ cat slow0* > original.log
总结
切割成小文件之后,无论是下载到本地再处理、本地查看、还是条件检索都非常方便了