log中提取关键词,关键词所在行的时间写入 csv文件。
准备工作
Win+R,输入cmd,回车进入cmd命令行。
进入filter.exe所在的目录。
filter.exe放在 log文件所在的目录。
命令行用法
// 显示帮助信息,$不要拷贝
$ filter.exe -help
// 相当于执行 filter.exe -all=true -key="ov9281",将对当前目录下的所有*.log文件
//(不包含子文件夹下的log文件),
// 查找默认关键词“ov9281”,并逐个写入log对应的csv文件,
// 一个log文件对应一个csv文件
$ filter.exe
//对单个文件执行搜索关键词并将结果写入 csv文件。
// all 要指定为 false,默认为true,-file,-key,-all顺序不限。
// "test.log"为相对路径
// -file="D:\\script\\go\\Filter\\2020_03_23_Serial-COM3.log",指定为绝对路径。
$ filter.exe -key="ov9281" -file="test.log" -all=false
// 搜索关键词 ov9281,并将搜索所有的*.log文件,搜索结果
// 写入log文件对应的csv文件
// 推荐使用这种
$ fitler.exe -key="0v9281"
filter.go
package main
import (
"encoding/csv"
"flag"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"strings"
"time"
)
func main() {
keyword := flag.String("key", "ov9281", "search keyword by input")
all := flag.Bool("all", true, "search every *.log files in current folder")
filename := flag.String("file", "test.log", "log file name path")
flag.Parse()
if !(*all) {
WriteToCsv(*filename, *keyword)
} else {
fmt.Println("Paths: ", FindAllLogs())
for _, path := range FindAllLogs() {
WriteToCsv(path, *keyword)
}
}
}
func WriteToCsv(filename, keyword string) {
content, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Printf("read file %s,err: %v\n", filename, err)
return
}
lines := strings.Split(string(content), "\n")
// match datetime
re := regexp.MustCompile("[\\d:_]{17}")
// record matched
var ret []string
for _, line := range lines {
// contain keyword
if strings.Contains(line, keyword) {
ret = append(ret, re.FindString(line))
}
}
// write to csv
prefix := strings.Split(filename, ".")[0]
//prefix file name
csvFile := prefix + ".csv"
f, err := os.OpenFile(csvFile, os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
fmt.Printf("create or open file: %s error:%v\n", csvFile, err)
}
defer f.Close()
if err != nil {
fmt.Printf("create csv file: %s err: %v\n", csvFile, err)
}
w := csv.NewWriter(f)
res := ParseRecords(ret)
w.WriteAll(res)
if err := w.Error(); err != nil {
fmt.Println("error writing csv:", err)
}
fmt.Printf("write to csv:%s success!\n", prefix+".csv")
return
}
func FindAllLogs() []string {
var paths []string
filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
if err != nil {
fmt.Printf("accessing a path %q: %v\n", path, err)
return err
}
if !info.IsDir() && strings.Contains(info.Name(), ".log") {
paths = append(paths, path)
}
return nil
})
return paths
}
// sub
func ParseRecords(records []string) [][]string {
var ret [][]string
var timeSlice []time.Time
for _, item := range records {
t, err := ParseTimeStr(item)
if err != nil {
fmt.Println("parse err: %v\n", err)
}
timeSlice = append(timeSlice, t)
}
// caculate delta time
ret = append(ret, []string{records[0], "0s"})
for index := 1; index < len(timeSlice); index++ {
delta := timeSlice[index].Sub(timeSlice[index-1])
ret = append(ret, []string{records[index], delta.String()})
}
return ret
}
func ParseTimeStr(timeStr string) (time.Time, error) {
timeFormat := "20060102_15:04:05"
t, err := time.Parse(timeFormat, timeStr)
if err != nil {
return time.Time{}, err
}
return t, nil
}
网友评论