AWK is a fascinating text-processing language, and somehow after reading the delightfully-terse The AWK Programming Language I was inspired to write an interpreter for it in Go. So here it is, feature-complete and tested against "the one true AWK" test suite.
Read more about how GoAWK works and performs here.
To use the command-line version, simply use go install
to install it, and then run it using goawk
(assuming $GOPATH/bin
is in your PATH
):
$ go install github.com/benhoyt/goawk@latest
$ goawk 'BEGIN { print "foo", 42 }'
foo 42
$ echo 1 2 3 | goawk '{ print $1 + $3 }'
4
On Windows, "
is the shell quoting character, so use "
around the entire AWK program on the command line, and use '
around AWK strings -- this is a non-POSIX extension to make GoAWK easier to use on Windows:
C:\> goawk "BEGIN { print 'foo', 42 }"
foo 42
To use it in your Go programs, you can call interp.Exec()
directly for simple needs:
input := bytes.NewReader([]byte("foo bar\n\nbaz buz"))
err := interp.Exec("$0 { print $1 }", " ", input, nil)
if err != nil {
fmt.Println(err)
return
}
// Output:
// foo
// baz
Or you can use the parser
module and then interp.ExecProgram()
to control execution, set variables, and so on:
src := "{ print NR, tolower($0) }"
input := "A\naB\nAbC"
prog, err := parser.ParseProgram([]byte(src), nil)
if err != nil {
fmt.Println(err)
return
}
config := &interp.Config{
Stdin: bytes.NewReader([]byte(input)),
Vars: []string{"OFS", ":"},
}
_, err = interp.ExecProgram(prog, config)
if err != nil {
fmt.Println(err)
return
}
// Output:
// 1:a
// 2:ab
// 3:abc
Read the documentation for more details.
The intention is for GoAWK to conform to awk
's behavior and to the POSIX AWK spec, but this section describes some areas where it's different.
Additional features GoAWK has over AWK:
- It's embeddable in your Go programs! You can even call custom Go functions from your AWK scripts.
- I/O-bound AWK scripts (which is most of them) are significantly faster than
awk
, and on a par withgawk
andmawk
. - The parser supports
'single-quoted strings'
in addition to"double-quoted strings"
, primarily to make Windows one-liners easier (the Windowscmd.exe
shell uses"
as the quote character).
Things AWK has over GoAWK:
- CPU-bound AWK scripts are slightly slower than
awk
, and about twice as slow asgawk
andmawk
. - AWK is written by Brian Kernighan.
This project has a good suite of tests, and I've used it a bunch personally, but it's certainly not battle-tested or heavily used, so please use at your own risk. I intend not to change the Go API in a breaking way.
The GoAWK repository also includes the creatively-named AWKGo, an AWK-to-Go compiler. This is experimental and is not subject to the stability requirements of GoAWK itself. You can read more about AWKGo or browse the AWKGo code.
GoAWK is licensed under an open source MIT license.
Have fun, and please contact me if you're using GoAWK or have any feedback!