类似linux tail -n的功能如何实现

Linux tail -n的功能是如何实现的?

如果文件非常大,如何快速的取到文件的最后n行数据呢?

使用strace 命令跟踪下,发现如下的输出:

strace tail -1000 test.log  2>&1 | grep lseek
lseek(3, 0, SEEK_CUR)                   = 0
lseek(3, 0, SEEK_END)                   = 52876697
lseek(3, 52871168, SEEK_SET)            = 52871168
lseek(3, 52862976, SEEK_SET)            = 52862976
lseek(3, 52854784, SEEK_SET)            = 52854784
...
  1. 使用SEEK_END找到文件的大小(为52876697)
  2. 然后使用SEEK_SET定位到文件的最后一个page,从上面这个case看,page大小是8192,最后一个page没满8192字节,seek到52876697 - 52876697 % 8192 == 52871168这个position
  3. 读取这一个page的所有数据,统计总共出现多少个换行
  4. 如果里面的行数不到n,再往前seek一个page(52871168-8192 == 52862976),读取数据,统计行数。
  5. 循环步骤4,直到取到n行数据。
  6. 顺序读取数据,输出n行数据。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值