AWK 是一种引人入胜的文本处理语言,在阅读了令人愉快的 AWK 编程语言 简洁之后,我很高兴能在 Go 中为它写一个解释器。所以,我宣布这里是,功能完整的测试套件"一个真正的 AWK"。
要使用命令行版本,只需使用 go get 安装它,然后使用 goawk(假设 $GOPATH/bin 在你的 PATH):
- $ go get github.com/benhoyt/goawk
- $ goawk 'BEGIN { print "foo", 42 }'
- foo 42
- $ echo 1 2 3 | goawk '{ print $1 + $3 }'
- 4
要在 Go 程序中使用它,您可以调用 interp.Exec(),其直接满足简单需求:
- 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
或者你可以使用parser模块,然后使用interp.ExecProgram()控制执行,设置变量等:
- 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
请阅读 GoDoc 文档(link:https://godoc.org/github.com/benhoyt/goawk) 更多细节.
目的是让 GoAWK 遵守 awk 的行为和对 POSIX AWK 规格(link:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html),但本节介绍了一些不同的地方.
GoAWK 的其他功能优于 AWK:
AWK 超过 GoAWK 的:
这个项目有一套很好的测试,我亲自使用它,但它肯定没有经过实战测试,或大量使用,所以请自担风险使用。我不打算大改 Go API.