首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用regexp解析Apache日志文件

使用regexp解析Apache日志文件
EN

Stack Overflow用户
提问于 2019-04-03 06:53:26
回答 1查看 491关注 0票数 0

我正在解析一个已自定义为只给我两个值的Apache日志:"time“和"memory”(值是毫秒数和字节数),它们都是int64或float64,但我使用regexp并对文件进行解析,所以当我匹配文件的内容时,返回"[]“(空大括号)而不是填充切片,我的代码是:

代码语言:javascript
复制
for _, line := range lines {
    var buffer bytes.Buffer

    buffer.WriteString(`\[0-9]+\s`)
    buffer.WriteString(`[0-9]+\s`)
    re1, err := regexp.Compile(buffer.String())

    if err != nil {
        log.Fatalf("regexp: %s", err)
    }
    result := re1.FindStringSubmatch(line)
    fmt.Println(result)
}

当我打印结果时,它给了我空大括号,当我运行整个程序时,它给出超出范围的索引(这是可以理解的,因为结果是空的)。

我的数据如下:

代码语言:javascript
复制
1040 3952
2849 6832
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-03 07:49:59

Regexp是这个工作的完全错误的工具。只要使用strings.Splitstrings.Fields,阅读起来就容易得多,操作也要快得多。

代码语言:javascript
复制
for _, line := range lines {
    fields := strings.Fields(line)
    ms := fields[0]
    size := fields[1]
    fmt.Printf("time: %v, size: %v\n", ms, size)
}

如果您想将这些转换为数字,您可以很容易地使用strconv包进行转换,如果您得到意外的(非数字的)输入,它将检测到它的额外好处):

代码语言:javascript
复制
for _, line := range lines {
    fields := strings.Fields(line)
    ms, err := strconv.Itoa(fields[0])
    if err != nil {
        log.Fatalf("time field: %s", err)
    }
    size, err := strconv.Atoi(fields[1])
    if err != nil {
        log.Fatalf("size field: %s", err)
    }
    fmt.Printf("time: %v, size: %v\n", ms, size)
}

如果您坚持使用正则表达式,至少只编译一次,在for循环之外:

代码语言:javascript
复制
re, err := regexp.Compile( ... )
if err != nil {
    log.Fatalf("regexp: %s", err)
}
for _, line := range lines {
    result := re.FindStringSubmatch(line)
    fmt.Println(result)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55488836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档