Skip to content

Instantly share code, notes, and snippets.

@yujp
Created February 11, 2020 08:01
Show Gist options
  • Save yujp/cc58c5c9c3dacddf29e85a13f7cdca46 to your computer and use it in GitHub Desktop.
Save yujp/cc58c5c9c3dacddf29e85a13f7cdca46 to your computer and use it in GitHub Desktop.
package main
import (
"bufio"
"os"
"strings"
"fmt"
"time"
"io"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("file name must be specified.")
return
}
filename := os.Args[1]
file, err := os.Open(filename)
if err != nil {
fmt.Printf("failed to open file: %v", err)
return
}
reader := bufio.NewReader(file)
const layout = "02/Jan/2006:15:04:05 -0700"
dateMap := map[string]uint64{}
for {
b, _, err := reader.ReadLine()
if err == io.EOF {
break
} else if err != nil {
panic(err)
}
line := strings.TrimSpace(string(b))
if line == "" {
continue
}
d := getDate(line)
dt, err := time.Parse(layout, d)
if err != nil {
fmt.Println(line)
panic(err)
}
date := dt.Format("20060102")
if val, ok := dateMap[date]; ok {
dateMap[date] = val + 1
} else {
dateMap[date] = 1
}
}
writers := map[string]*bufio.Writer{}
for date := range dateMap {
fname := date + ".log"
fo, err := os.OpenFile(fname, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
panic(err)
}
defer fo.Close()
fw := bufio.NewWriter(fo)
defer fw.Flush()
writers[date] = fw
}
file.Seek(0, 0)
reader = bufio.NewReader(file)
for {
b, _, err := reader.ReadLine()
if err == io.EOF {
break
} else if err != nil {
panic(err)
}
line := strings.TrimSpace(string(b))
if line == "" {
continue
}
d := getDate(line)
dt, err := time.Parse(layout, d)
if err != nil {
fmt.Println(line)
panic(err)
}
date := dt.Format("20060102")
if w, ok := writers[date]; ok {
w.WriteString(line)
w.WriteString("\n")
} else {
panic("no writer found")
}
}
}
func getDate(line string) string {
begin := strings.IndexRune(line, '[')
if begin == -1 {
return ""
}
end := strings.IndexRune(line[begin+1:], ']')
if end == -1 {
return ""
}
end++
return line[begin+1 : begin+end]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment