gologf/main.go

104 lines
2.3 KiB
Go

package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
"regexp"
)
func main() {
// 定义命令行参数
startPattern := flag.String("start", "", "起始模式")
endPattern := flag.String("end", "", "截止模式")
// 解析命令行参数
flag.Parse()
// 参数校验
if flag.NArg() != 1 || *startPattern == "" {
fmt.Printf("用法: %s -start <起始模式> [-end <截止模式>] <日志文件名>\n", os.Args[0])
os.Exit(1)
}
// 获取非标志参数作为文件名
filename := flag.Arg(0)
// 编译起始正则表达式
startRegex, err := regexp.Compile(*startPattern)
if err != nil {
fmt.Printf("编译起始模式正则表达式失败: %v\n", err)
os.Exit(1)
}
// 编译截止正则表达式(如果提供了的话)
var endRegex *regexp.Regexp
if *endPattern != "" {
endRegex, err = regexp.Compile(*endPattern)
if err != nil {
fmt.Printf("编译截止模式正则表达式失败: %v\n", err)
os.Exit(1)
}
}
// 打开日志文件
file, err := os.Open(filename)
if err != nil {
fmt.Printf("无法打开文件 %s: %v\n", filename, err)
os.Exit(1)
}
defer file.Close()
// 创建带缓冲的读取器
reader := bufio.NewReader(file)
var inside bool // 标记是否在起始和截止模式之间
var lines []string // 存储匹配到的日志行
for {
// 读取一行
line, err := reader.ReadString('\n')
if err != nil {
if err == io.EOF {
break // 文件结束
}
fmt.Printf("读取文件时出错: %v\n", err)
os.Exit(1)
}
// 匹配起始模式
if !inside && startRegex.FindStringIndex(line) != nil {
inside = true
lines = append(lines, line) // 包含起始行
continue
}
// 如果已匹配起始模式,并且有截止正则表达式,则检查截止模式
if inside && endRegex != nil {
if endRegex.FindStringIndex(line) != nil {
inside = false
// 选择性地包含截止行(根据需求决定)
// lines = append(lines, line)
break // 找到第一个截止模式后退出循环
}
}
// 如果在起始和截止模式之间,则收集该行
if inside {
lines = append(lines, line)
}
}
// 输出匹配到的日志行
for _, line := range lines {
fmt.Println(line)
}
// 如果没有找到匹配的行,输出提示信息
if len(lines) == 0 {
fmt.Println("未找到匹配的日志内容")
}
}