GoAWK 用 Go 编写的 AWK 解释器
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 文档 更多细节.
与 AWK 的差异
目的是让 GoAWK 遵守 awk
的行为和对 POSIX AWK 规格,但本节介绍了一些不同的地方.
GoAWK 的其他功能优于 AWK:
- 它可以嵌入你的 Go 程序中!
- I/O 绑定的 AWK 脚本(大多数脚本)明显快于
awk
,与gawk
和mawk
相比. - 解析器同时支持
'单引号 strings'
,除了"double-quoted strings"
,主要是为了让 Windows 单行更容易(Windowscmd.exe
shell 使用"
作为引用字符).
AWK 超过 GoAWK 的:
- CPU 绑定的 AWK 脚本比
awk
慢,和也比gawk
和mawk
大约慢两倍. - AWK 由 Brian Kernighan 编写.
稳定性
这个项目有一套很好的测试,我亲自使用它,但它肯定没有经过实战测试,或大量使用,所以请自担风险使用。我不打算大改 Go API.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论