go 實時讀取文件內(nèi)容

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、實時讀取文件新增內(nèi)容

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, "即時輸出文件變化后追加的數(shù)據(jù)。")
    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
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容