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