在不指定awk确切位置的情况下从shell脚本运行awk文件

5
我正在尝试调试一个调用awk文件的shell脚本。 这很困难,因为我以前从未使用过这两者,而且对Linux也不是很熟悉。
开发人员制作了一个awk文件,并尝试在shell脚本中运行它。
为了尝试从不同位置运行它,而无需指定确切位置,他们将awk脚本放在PATH变量中的一个文件夹中。所以该awk文件应该在任何地方都可用,对吗?
当你这样运行它时...
awk -f script.awk arg1
awk能找到该脚本吗? 它会在shell脚本尝试运行该awk命令时输出错误:
awk: fatal: can't open source file `script.awk' for reading (No such file or directory)
2个回答

8

正如您所知,awk 无法找到脚本本身。

如果此脚本标记为可执行文件,并且您有一个 which 命令,则可以执行以下操作:

awk -f `which script.awk` arg1

或者更好的方法是将脚本制作成可执行文件:

#!/usr/bin/awk -f 
BEGIN { x = 23 }
      { x += 2 }
END   { print x }

在我测试过的MacOS X 10.7.1上,shebang需要使用'-f'选项才能正常工作:

$ script.awk script.awk
31
$

这为您提供了一个自包含的单文件解决方案。

对于“#!”方法,我给予加1的支持,尽管许多UNIX系统应该更喜欢“#!/usr/bin/env awk”(参考资料)。 - sehe
1
@sehe: 我会使用 #!/usr/bin/env awk,但是你只保证了一个参数,而我需要用到 -f。实际上,我尝试过使用 #!/usr/bin/env awk,但当它不起作用时,我感到有些沮丧(但是,在回头使用 #!/usr/bin/env awk -f 时,它在 MacOS X 上确实起作用了)。你的情况可能会有所不同。提到 #!/usr/bin/env 还是值得一提的... - Jonathan Leffler

2

不行,那样做行不通。awk需要脚本的路径才能运行,它不会使用PATH变量来查找。PATH只用于查找可执行文件。


确切地说,该命令应该类似于 awk -f /path/to/script.awk arg1 - gpojd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接