Golang语言实现 tail 查看文本文件末行功能,类似于linux tail -n 100 功能
时间:2022-05-04
本文章向大家介绍Golang语言实现 tail 查看文本文件末行功能,类似于linux tail -n 100 功能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
主要用于Web服务日志最新行查看。
package main
import(
"fmt"
"os"
"bytes"
)
const (
defaultBufSize = 4096
)
func tail( filename string, n int ) (lines []string,err error) {
f,e := os.Stat( filename )
if e == nil {
size := f.Size()
var fi *os.File
fi,err = os.Open(filename)
if err == nil{
b := make( []byte,defaultBufSize )
sz := int64(defaultBufSize)
nn := n
bTail := bytes.NewBuffer([]byte{})
istart := size
flag := true
for flag {
if istart < defaultBufSize {
sz = istart
istart = 0
//flag = false
}else{
istart -= sz
}
_,err = fi.Seek( istart,os.SEEK_SET )
if err==nil {
mm,e := fi.Read( b )
if e==nil && mm>0 {
j := mm
for i:=mm-1;i>=0;i-- {
if b[i]=='n' {
bLine := bytes.NewBuffer([]byte{})
bLine.Write( b[i+1:j] )
j = i
if bTail.Len()>0 {
bLine.Write( bTail.Bytes() )
bTail.Reset()
}
if (nn==n && bLine.Len()>0) || nn<n { //skip last "n"
lines = append( lines,bLine.String() )
nn --
}
if nn==0 {
flag = false
break
}
}
}
if flag && j>0 {
if istart==0 {
bLine := bytes.NewBuffer([]byte{})
bLine.Write( b[:j] )
if bTail.Len()>0 {
bLine.Write( bTail.Bytes() )
bTail.Reset()
}
lines = append( lines,bLine.String() )
flag = false
}else{
bb := make( []byte,bTail.Len() )
copy( bb,bTail.Bytes() )
bTail.Reset()
bTail.Write( b[:j] )
bTail.Write( bb )
}
}
}
}
}
//func (f *File) Seek(offset int64, whence int) (ret int64, err error)
//func (f *File) Read(b []byte) (n int, err error) {
}
defer fi.Close()
}
return
}
func main(){
lns,_ := tail("此处为日志文件路径",50) //查看文件末行
for _,v := range lns {
fmt.Println( v )
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Rust日报】2020-08-06 使用 Rust 编写的 Lambdas 在 AWS IoT 和 SQS 队列之间传递消息
- react-router-config的使用
- Spring 源码解读第七弹!bean 标签的解析
- Kubeflow实战: 入门介绍与部署实践
- matplotlib基础绘图命令之violinplot
- 性能分析(3)- 短时进程导致用户 CPU 使用率过高案例
- stat 命令家族(1)- 详解 vmstat
- 性能测试必备知识(9)- 深入理解“软中断”
- Vue老项目支持Webpack打包
- 09-4 更改用户密码
- 10-3 信号
- 11-1 环境中存储的是什么?
- 【Rust日报】2020-08-07 无船同志关于Rust未来Generator语法的新尝试
- 11-2 环境是如何建立的
- 11-3 激活修改