将参数传递给 awk 脚本

Ada*_*amR 6 shell awk shell-script

我有一个 awk 脚本,我希望能够将 N 个参数传递给它并从标准输入读取。我希望能够做类似的事情

tail -f logfile | my_cool_awk_scipt var1 var2 var3 ... varN

然后在脚本中使用这些变量。

#!/bin/awk -f

BEGIN { 
print "AWK Script Starting" 
print ARGV[1]
}                                                                              
{
    if ($0 < ARGV[1])
        print $0
    else if ($0 < ARGV[2])
        print $0 + ARGV[2]             
}
  
Run Code Online (Sandbox Code Playgroud)

如果我尝试按原样传递变量,它会打印ARGV[1]然后点击

awk: ./my_cool_awk_script:4: fatal: cannot open file `var1' for reading (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

我可以,

tail -f logfile | my_cool_awk_scipt -v var1=var1 -v var2=var2 -v var3=var3 ... varN=varN
Run Code Online (Sandbox Code Playgroud)

但这有点限制和冗长。我知道我也可以将它包装在一个 shell 脚本中,但我不确定将我所拥有的东西嵌入到类似的东西中的干净方法。

ste*_*eve 5

awk 到达脚本主体的那一刻,在 之后BEGIN,它将想要读取 ARGV[x] 中指定的文件名。所以就用核弹吧。

$ cat a.awk
#!/bin/awk -f
BEGIN {
print "AWK Script Starting"
ZARGV[1]=ARGV[1]
ZARGV[2]=ARGV[2]
ARGV[1]=""
ARGV[2]=""
}
{
    if ($0 < ZARGV[1])
        print $0
    else if ($0 < ZARGV[2])
        print $0 + ZARGV[2]
}
$
Run Code Online (Sandbox Code Playgroud)

例子:

$ cat logfile
1
2
3
4
5
$ ./a.awk 3 4 <logfile
AWK Script Starting
1
2
7
$
Run Code Online (Sandbox Code Playgroud)

  • 虽然其他答案都很好,但这能够以最直接的方式解决我的问题。干杯 (2认同)
  • 也许像`BEGIN{for(i in ARGV) ZARGV[i]=ARGV[i]; 删除 ARGV}` 来处理任意数量的参数? (2认同)