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("未找到匹配的日志内容") } }