AWK参数vs文件

时间:2015-12-15 22:06:09

标签: awk

假设我有两段代码:

awk ' BEGIN {for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]}} {print "So as you can see, complications can occur."} ' one two three four

除非目录中有一个名为one的文件,否则此部分将无效。

awk ' BEGIN {for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]}}' one two three four

这将正常工作,one two three four将被理解为参数。那为什么前者不起作用呢?是什么让awk认为某些东西来自文件而某些东西是争论?谢谢。

2 个答案:

答案 0 :(得分:4)

运行任何BEGIN块后,如果有剩余代码,则每行输入一次运行 - 这意味着awk必须读取其输入。如果ARGVawk读取输入时有任何内容,则会将其解释为要打开和读取的文件列表;否则,将读取标准输入。

在您的示例中,提及并发症的print行不在BEGIN块内,因此在awk读取输入行之前不会运行 - 它会尝试从文件one开始,因为它是第一个参数。

如果你想将参数传递给AWK程序而不将它们视为文件名,你可以;如果您还有ARGV块之外的任何代码,请务必不要将它们留在BEGIN中:

awk 'BEGIN {
       for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]};
       delete ARGV} 
     {print "So as you can see, complications can occur."}' one two three four

以上将打印出消息,然后在标准输入上等待一行。收到任何行后,它会打印出有关并发症的信息。

如果你只是想让一个AWK程序在没有尝试读取和处理任何输入的情况下完成它的工作 - 除了那个AWK可能是一个奇怪的选择 - 只需将所有代码放在一个或多个BEGIN中块。如果awk完成BEGIN块并且找不到其他代码,则它将退出而不尝试读取任何输入。

答案 1 :(得分:2)

awk需要有效的输入数据(来自文件或stdin)来执行BEGIN块之外的代码。在第一个代码段中,您在print之外有一个BEGIN语句,如果awk有一些有效输入(即使为空),将会执行该语句。但是,如果您的输入文件不存在,那么awk将返回此错误:

fatal: cannot open file `one' for reading (No such file or directory)

第二个代码段没有有效输入,因为您只有BEGIN块内的代码。