AWK 参数与文件

Hic*_*man 4 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
Run Code Online (Sandbox Code Playgroud)

one除非目录中有一个被调用的文件,否则这篇文章将无法工作。

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

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

Mar*_*eed 6

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

在您的示例中,print提到复杂性的行不在块内,因此在读取一行输入BEGIN之前它不会运行- 它将尝试从文件中执行此操作,因为它是第一个参数。awkone

如果您想将参数传递给 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
Run Code Online (Sandbox Code Playgroud)

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

如果您只是想让 AWK 程序完成其任务,而不尝试读取和处理任何输入(暂且不说 AWK 对于该场景来说可能是一个奇怪的选择),只需将所有代码放入一个或多个BEGIN块中即可。如果awk完成BEGIN块并且没有找到其他代码,它将退出而不尝试读取任何输入。