可执行awk脚本输出其名称

时间:2017-08-24 09:08:38

标签: shell awk gawk

我有一个简单的可执行awk脚本,我试图说出它自己的名字:

$ cat script.awk
#!/usr/bin/awk -f
BEGIN {
    print "Hi, I'm " ARGV[0]
}

执行时:

$ chmod u+x script.awk
$ ./script.awk
Hi, I'm awk

预期(好的,无论如何)期望输出为Hi, I'm script.awk。有没有办法实现这一点,除了将其转换为shell脚本,如:

$ cat script.sh
#!/bin/bash
read -d '' script <<EOF
BEGIN {
    print "Hi, I'm " var
}
EOF
awk -v var=$0 "$script"

aaand,行动:

$ ./script.sh
Hi, I'm ./script.sh

1 个答案:

答案 0 :(得分:1)

在bash或zsh中,您可以通过$_使用shell环境变量ENVIRON["_"]

$ cat script.awk
#!/usr/bin/awk -f
BEGIN {
  print "Hi, I'm " ENVIRON["_"]
}
$ chmod u+x script.awk
$ ./script.awk
Hi, I'm /tmp/./script.awk

ENVIRON数组是POSIX标准中定义的awk special variable,因此它应该可以在任何版本的awk中随时使用,但不同的shell以不同的方式实现$_,所以只有从bash或zsh 调用它时才可靠。

这将在短划线(commonly安装为/bin/sh)中工作,因为短划线将上一个命令分配给$_(如果这是第一个命令,它将改为分配自己。)

Korn Shell(至少ksh93)将shell的PID(由星号包围)作为前缀加上值*12345*./script.awk,因此需要稍加修改。

此版本适用于bash,zsh和ksh:

#!/usr/bin/awk -f
BEGIN {
  self = ENVIRON["_"]
  sub(/^\*[0-9]+\*/, "", self)
  print "Hi, I'm " self
}