94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Beego (http://beego.me/)
 | 
						|
// @description beego is an open-source, high-performance web framework for the Go programming language.
 | 
						|
// @link        http://github.com/astaxie/beego for the canonical source repository
 | 
						|
// @license     http://github.com/astaxie/beego/blob/master/LICENSE
 | 
						|
// @authors     astaxie
 | 
						|
 | 
						|
package utils
 | 
						|
 | 
						|
import (
 | 
						|
	"bufio"
 | 
						|
	"errors"
 | 
						|
	"io"
 | 
						|
	"os"
 | 
						|
	"path/filepath"
 | 
						|
	"regexp"
 | 
						|
)
 | 
						|
 | 
						|
// SelfPath gets compiled executable file absolute path
 | 
						|
func SelfPath() string {
 | 
						|
	path, _ := filepath.Abs(os.Args[0])
 | 
						|
	return path
 | 
						|
}
 | 
						|
 | 
						|
// SelfDir gets compiled executable file directory
 | 
						|
func SelfDir() string {
 | 
						|
	return filepath.Dir(SelfPath())
 | 
						|
}
 | 
						|
 | 
						|
// FileExists reports whether the named file or directory exists.
 | 
						|
func FileExists(name string) bool {
 | 
						|
	if _, err := os.Stat(name); err != nil {
 | 
						|
		if os.IsNotExist(err) {
 | 
						|
			return false
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return true
 | 
						|
}
 | 
						|
 | 
						|
// Search a file in paths.
 | 
						|
// this is often used in search config file in /etc ~/
 | 
						|
func SearchFile(filename string, paths ...string) (fullpath string, err error) {
 | 
						|
	for _, path := range paths {
 | 
						|
		if fullpath = filepath.Join(path, filename); FileExists(fullpath) {
 | 
						|
			return
 | 
						|
		}
 | 
						|
	}
 | 
						|
	err = errors.New(fullpath + " not found in paths")
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// like command grep -E
 | 
						|
// for example: GrepFile(`^hello`, "hello.txt")
 | 
						|
// \n is striped while read
 | 
						|
func GrepFile(patten string, filename string) (lines []string, err error) {
 | 
						|
	re, err := regexp.Compile(patten)
 | 
						|
	if err != nil {
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	fd, err := os.Open(filename)
 | 
						|
	if err != nil {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	lines = make([]string, 0)
 | 
						|
	reader := bufio.NewReader(fd)
 | 
						|
	prefix := ""
 | 
						|
	isLongLine := false
 | 
						|
	for {
 | 
						|
		byteLine, isPrefix, er := reader.ReadLine()
 | 
						|
		if er != nil && er != io.EOF {
 | 
						|
			return nil, er
 | 
						|
		}
 | 
						|
		if er == io.EOF {
 | 
						|
			break
 | 
						|
		}
 | 
						|
		line := string(byteLine)
 | 
						|
		if isPrefix {
 | 
						|
			prefix += line
 | 
						|
			continue
 | 
						|
		} else {
 | 
						|
			isLongLine = true
 | 
						|
		}
 | 
						|
 | 
						|
		line = prefix + line
 | 
						|
		if isLongLine {
 | 
						|
			prefix = ""
 | 
						|
		}
 | 
						|
		if re.MatchString(line) {
 | 
						|
			lines = append(lines, line)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return lines, nil
 | 
						|
}
 |