Source File: go-coreutils/grep/main.go

package main

import (
  "fmt"
  "regexp"
  "os"
  "bufio"
  "flag"
  "log"
  "io"
)

func ScanInput(input io.Reader, exp string, prefix string) {
	scan := bufio.NewScanner(input)
	re, err := regexp.Compile(exp)

	if err != nil { log.Fatal(err) }

	for scan.Scan() {
		line := scan.Text()

		if re.MatchString(line) {
			if prefix != "" {
				fmt.Print(prefix, ": ")
			}

			fmt.Println(line)
		}
	}
}

func main() {
	flag.Parse()

	args := flag.Args()

	if len(args) == 0 {
		log.Fatal("USAGE: grep <regex> [files...]")
	} else if len(args) == 1 {
		ScanInput(os.Stdin, args[0], "")
	} else {
		exp := args[0]
		files := args[1:]

		for _, file := range files {
			input, err := os.Open(file)
			if err != nil { log.Fatal(err) }

			ScanInput(input, exp, file)
		}
	}
}