美文网首页
go 实时读取文件内容

go 实时读取文件内容

作者: David_wliu | 来源:发表于2019-06-26 16:42 被阅读0次

1、实时读取命令输出

package main

import (
    "bufio"
    "fmt"
    "exec"
    )

func main() {
    cmd := exec.Command("sh", "-c", "tail -f /var/log/secure")
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        panic(err)
    }
    go func() {
        reader := bufio.NewReader(stdout)
        for {
            line, _, err := reader.ReadLine()
            if err != nil {
                panic(err)
            }
            fmt.Println(string(line))
        }
    }()
    err = cmd.Run()
    if err != nil {
        panic(err)
    }
}

2、实时读取文件新增内容

package main

import (
    "flag"
    "fmt"
    "io"
    "os"
    "runtime"
)

import (
    "github.com/axgle/mahonia"
)

type ReadFile struct {
    file    *os.File
    gbkFile *mahonia.Reader
}

func (f *ReadFile) gbkDecode() {
    decoder := mahonia.NewDecoder("gbk")
    f.gbkFile = decoder.NewReader(f.file)
}

func (f *ReadFile) ReadPrint() {
    var n int
    var err error
    data := make([]byte, 1<<16)
    if runtime.GOOS == "windows" {
        f.gbkDecode()
        n, err = f.gbkFile.Read(data)
    } else {
        n, err = f.file.Read(data)
    }
    switch err {
    case nil:
        var lines int
        out := data
        indexs := make(map[int]int)
        for i, d := range out {
            if d == '\n' {
                lines++
                indexs[lines] = i
            }
        }
        lines += 1

        if lines <= line || line <= 0 {
            fmt.Print(string(data[:n]))
        } else {
            index := indexs[lines-line]
            fmt.Print(string(data[index+1 : n]))
        }

    case io.EOF:
    default:
        fmt.Println(err)
        return
    }
}

var (
    follow bool
    line   int
)

func init() {
    flag.BoolVar(&follow, "f", false, "即时输出文件变化后追加的数据。")
    flag.IntVar(&line, "n", 10, "output the last K lines, instead of the last 10")
}

func main() {
    flag.Parse()
    var err error
    var readFile ReadFile
    if len(os.Args) < 2 {
        flag.Usage()
        return
    }

    readFile.file, err = os.Open(os.Args[len(os.Args)-1])
    if err != nil {
        fmt.Println(err)
        return
    }
    defer readFile.file.Close()

    for {
        readFile.ReadPrint()
        if !follow {
            break
        }
    }
}

相关文章

  • go 实时读取文件内容

    1、实时读取命令输出 2、实时读取文件新增内容

  • Go语言:文件追加内容

    代码实例 相关文章 Go语言:获取某个目录下的所有文件 Go语言:读取文本文件并输出内容 Go语言:将字符串保存成...

  • Go语言:将字符串保存成文件

    代码实例 相关文章 Go语言:获取某个目录下的所有文件 Go语言:读取文本文件并输出内容 Go语言:将字符串保存成...

  • Go实时监听日志文件内容

    最近自己的frp转发的一些内网远程连接,老是被莫名其妙的人进行暴力破解,而且破解的IP大都是国外的。于是想写个程序...

  • python3 读取文本文件

    读取文件内容 读取目录下所有文件的内容

  • Java读取文件方法汇总

    这篇文章主要为大家详细介绍了Java读取文件方法,按字节读取文件内容、按字符读取文件内容、随机读取文件内容等,具有...

  • Java读取文件方法汇总

    这篇文章主要为大家详细介绍了Java读取文件方法,按字节读取文件内容、按字符读取文件内容、随机读取文件内容等,具有...

  • GO : 读取文件

    需要用到os和bufio包 用os.Open打开一个文件,用bufio.NewReader来读取文件

  • Go语言之文件读取与终端读取

    从文件一次性读取全部数据 直接读取文件全部内容 逐行读取文件内容 从标准输入读取数据

  • RandomAccessFile读写文件

    RandomAccessFile同时具备读写文件的能力 读取文件内容 对于读取整个文件内容的需求,它提供将文件内容...

网友评论

      本文标题:go 实时读取文件内容

      本文链接:https://www.haomeiwen.com/subject/iszccctx.html