gawk -e'BEGIN {'-e'print“ hello”}'如何工作?

时间:2019-04-15 21:18:38

标签: awk namespaces gnu

Gawk 5.0.0已于2019年4月12日发布。通过the announcement,我发现了这一点:

  

从4.2.1更改为5.0.0

     

(...)11.命名空间已实现!请参阅手册。这样的结果之一是-i包含的文件,-f读取的文件以及命令行程序段都必须是独立的语法单元。例如,您将无法再执行以下操作:

gawk -e 'BEGIN {' -e 'print "hello" }'

我很好奇这个不再支持的行为,但是不幸的是我的Gawk 4.1.3并没有提供太多输出:

$ gawk -e 'BEGIN {' -e 'print "hello" }'
gawk: cmd. line:1: BEGIN {
gawk: cmd. line:1:        ^ unexpected newline or end of string

根据我在GAWK 4.2手册中看到的,-e选项已被标记为有问题:

  

GNU Awk User's Guide, on Options

     

-e程序文本
   --source程序文本

     

在程序文本中提供程序源代码。使用此选项,您可以将文件中的源代码与您在命令行中输入的源代码混合在一起。当您具有要在命令行程序中使用的库函数时,此功能特别有用(请参阅AWKPATH变量)。

     

请注意,gawk会将每个字符串视为以换行符结尾(即使不是以换行符结尾)。这样可以简化整个程序的构建。

     

注意:目前,不要求每个程序文本都必须是完整的语法单元。即,以下当前有效:

$ gawk -e 'BEGIN { a = 5 ;' -e 'print a }'
-| 5
     

但是,这种情况将来可能会改变,因此依靠此功能并不是一个好主意。

但是,这再次在我的控制台中失败:

$ gawk -e 'BEGIN {a=5; ' -e 'print a }'
gawk: cmd. line:1: BEGIN {a=5; 
gawk: cmd. line:1:             ^ unexpected newline or end of string

gawk -e 'BEGIN {' -e 'print "hello" }'在Gawk <5上到底做什么?

1 个答案:

答案 0 :(得分:3)

它正在执行您所期望的操作-将各部分连接起来形成gawk 'BEGIN {print "hello" }',然后执行它。您实际上可以通过pretty-printing看到gawk如何组合代码段:

$ gawk -o- -e 'BEGIN {' -e 'print "hello" }'
BEGIN {
        print "hello"
}

该脚本没有必要在各节中进行编写和连接,但是如果您考虑使用以下内容:

$ cat usea.awk
{ a++ }

$ echo foo | gawk -e 'BEGIN{a=5}' -f usea.awk -e 'END{print a}'
6

然后您会看到预期的功能对于将某些命令行代码与文件中存储的脚本混合以运行将很有用:

$ gawk -o- -e 'BEGIN{a=5}' -f usea.awk -e 'END{print a}'
BEGIN {
        a = 5
}

{
        a++
}

END {
        print a
}