前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang语言实现 tail 查看文本文件末行功能,类似于linux tail -n 100 功能

Golang语言实现 tail 查看文本文件末行功能,类似于linux tail -n 100 功能

作者头像
李海彬
发布2018-03-26 12:36:13
1.1K0
发布2018-03-26 12:36:13
举报
文章被收录于专栏:Golang语言社区Golang语言社区

主要用于Web服务日志最新行查看。

代码语言:javascript
复制
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 )
}
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档