2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Go语言

GoAWK 用 Go 编写的 AWK 解释器

时间:12-14来源:作者:点击数:3
CDSY,CDSY.XYZ

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) 更多细节.

与 AWK 的差异

目的是让 GoAWK 遵守 awk 的行为和对 POSIX AWK 规格(link:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html),但本节介绍了一些不同的地方.

GoAWK 的其他功能优于 AWK:

  • 它可以嵌入你的 Go 程序中!
  • I/O 绑定的 AWK 脚本(大多数脚本)明显快于awk,与gawkmawk相比.
  • 解析器同时支持'单引号 strings',除了"double-quoted strings",主要是为了让 Windows 单行更容易(Windowscmd.exeshell 使用"作为引用字符).

AWK 超过 GoAWK 的:

  • CPU 绑定的 AWK 脚本比 awk 慢,和也比 gawk 和 mawk 大约慢两倍.
  • AWK 由 Brian Kernighan 编写.

稳定性

这个项目有一套很好的测试,我亲自使用它,但它肯定没有经过实战测试,或大量使用,所以请自担风险使用。我不打算大改 Go API.

项目地址:https://github.com/chinanf-boy/goawk-zh

CDSY,CDSY.XYZ
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐