go正则解析log文件

解析log:

下载需要解析的log

wget https://gist.githubusercontent.com/clanchun/2b5e07cda53718ccbf64f62fb31900c8/raw/64be7f018973717dd5faa7be2bfb817f50ed05bb/access.log

package main

import (
        "bufio"
        "io"
        "os"
        "fmt"
        "regexp"
        "strings"
)

var (
        filePath string
        logReg = `TCP_HIT/([0-9][0-9][0-9]) [0-9]+ [A-Z]+ http://c13.adrise.tv/04C0BF/v2/sources/content-owners/[0-9a-z]+/([0-9]+)/`
        logMap = make(map[string]int)
)

func init() {
        filePath =os.Args[1]
}

func processLog(contents string) {
        re := regexp.MustCompile(logReg)
        matches := re.FindAllStringSubmatch(contents, -1)
        for _, m := range matches {
                key := m[1]+ "_" +m[2]
                count, ok := logMap [ key ]
                if (ok) {
                        logMap [ key ] = count + 1
                } else {
                        logMap [ key ] = 1
                }
        }
}

func readLine(fileName string, handler func(string)) error {
        f, err := os.Open(fileName)
        if err != nil {
                return err
        }
        buf := bufio.NewReader(f)
        for {
                line, err := buf.ReadString('\n')
//TrimSpace 将删除 s 首尾连续的的空白字符 line = strings.TrimSpace(line) handler(line) if err != nil { if err == io.EOF { return nil } return err } } return nil } func main() { //filePath = "/data/access.log" if err := readLine(filePath, processLog); err != nil { panic(err) } for log:= range logMap { fmt.Println(log, "appear count: ", logMap [log]) } }