linux截取文件特定行,截取与分析日志文件的特定行数的操作

在处理MySQL数据库问题时,需要分析0-3点的slow.log日志。本文汇总了四种方法来截取特定时间段的日志:1) 使用head和tail命令结合;2) 利用sed命令;3) 通过awk命令;4) 直接用sed匹配时间范围。这些方法在不需要预先确定行号或需要精确截取时各有优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行操作系统和数据库系统管理时,经常会遇到在日志文件中查找某个字符,或者按照时间截取某个时间段的日志进行分析。

今天早上就遇到一个MySQL数据库上的问题,mysql数据库在0-3点的时候,数据库会话连接,tps,cpu和iowait等都比平时大了许多。

为了定位这个时间段内,到底发生了那些慢查询,消耗了资源,就需要在slow.log慢查询日志进行查询,截取和分析。

在处理过程中,对几种常用的日志截取方法进行了汇总和测试:

截取日志段的的方法汇总与测试

方式一: 确定时间段的行号,使用head和tail命令截取

搜索时间: Time: 151212 00:00:00

先到gg,到文件最前面,然后搜索 /Time: 151212  ,得到:

1979016 # Time: 151212  0:00:15

文件总行数为:

# wc -l slow-query-169-1212.log

1999422 slow-query-169-1212.log

1999422                                 limit 0,20;

然后在到文件最后面,G, 搜索4点之后开始的文件  /Time: 151212  4   ,得到:

1987392 # Time: 151212  4:00:05

确定需要查询的时间段行号后,使用head和tail命令进行截取:

>>> 1987392 - 1979016;

8376

需要截取的日志,最后行号为 1979016,想用head 命令,然后在用tail命令截取最后的 8376 行即可,命令为:

head -n 1979016 slow-query-169-1212.log | tail -n 8376   > slow-query-169-1212_00-03.log

方式二: 确定时间段的行号,使用sed命令截取

截取 151212  0-3点之间的慢查询日志:

sed -n '1979016,1987392p' slow-query-169-1212.log  > slow-query-169-1212_00-03.log

>>> 1987392 - 1979016;

8376

该部分文件,应该有 8376 行数据;确认正常;

方式三:确定时间段行号后,使用awk命令截取

截取 151212  0-3点之间的慢查询日志:

awk -F"\n" '{if(NR>=1979016&&NR <=1987392)print $0 }' slow-query-169-1212.log  > slow-query-169-1212_00-03.log

方式四:不需先确定行号,直接用sed取出日志段

slow log都是以  # Time: 151212  0:00:15 开头,直接用sed 取出其中的日志:

sed -n '/^# Time: 151212  0/,/^# Time: 151212  4/p' slow-query-169-1212.log > part.log--这样的效果,就和刚才上面的效果相同,取出了0 -3 点之间的数据

如果是想取出 151211 这一天的数据,则命令为:

sed -n '/^# Time: 151211/,/^# Time: 151212/p' slow-query-169-1212.log > part.log        --取出了151211 这一天的日志

注意,使用sed 时,两行之间的选择项一定要对应,不然结果就不是想要的结果了:

sed -n '/^# Time: 151212/,/^# Time: 151212  4/p' slow-query-169-1212.log > part.log     --前后两个时间点不同,搜索的是全部  # Time: 151212开头的

使用pt工具对截取的日志进行分析

分析这段时间的日志的命令如下:

/usr/local/pt/bin/pt-query-digest  /data/bbs/slow-query-169-1212_00-03.log > /data/bbs/slow-query-169-1212_00-03-report.log

这是默认的分析和排序方法,可以根据需求,选择其他pt报告分析方法

注1 vim中两种查询方式:

命令模式下,按‘/’,然后输入要查找的字符,Enter。?和/的区别是,一个向前(下)找,一个向后(上)。

另外,‘*’可以查找当前光标下的word(完全符合),‘g*’则部分符合,以#代替*表示向后(上)找

注2 几种文件处理方法的简单举例:

sed是按行处理的,不会将整个文件加载到内存中,可以放心使用

要切出从2012-02-09到2012-09-10的所有数据行,(假设你的日志文件以yyyy-MM-dd的日期格式开头)只需要:

sed -n '/^2012-02-09/,/^2012-09-10/p' whole.log > part.log

无论怎么样你都必须使用某一个程序把这个文件读出来,并且用一定的规则来加以过滤。

在Linux中,使用cat和grep对文件进行操作已经可以说是最经济合理的了。

占用一定的系统资源是肯定的,具体的话跟你使用的cat,grep以及linux内核都有一定关系,所以可能会略有不同。

一般不要在系统里出现那么大的日志文件,最好在一开始就做好日志的大小限制以及合理的日志转储和备份。

显示文件的第2到第6行

sed -n '2,6p' file

需要加-n参数.

head -n 6 file|tail -n 4

awk 也能达到要求

awk -F"\n" '{if(NR>=2&&NR <=6)print $0 }' file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值