我正在读某人的 awk 脚本。从标题开始#!/usr/bin/env awk -f。env 命令没有选项-f。因此,他们必须传递-fawk 命令的选项。我查看了 awk 的手册页。它表示Awk 扫描每个输入文件,查找与 prog 中字面指定的一组模式或指定为 -f progfile 的一个或多个文件中的任何一组模式相匹配的行。对于每个模式,可以有一个关联的操作,当文件的一行与该模式匹配时将执行该操作。
根据我的理解,这意味着 awk 通过搜索具有 progfile/prog 中指定模式的行来处理输入文件,具体取决于您是否在 awk 中使用 -f 选项。并且根据所使用的模式,对输入文件中找到的行执行关联的操作。我的问题是......运行 awk 脚本文件时它是如何工作的?我们没有在该行中指定 progfile #!/usr/bin/env awk -f。awk 脚本将使用什么模式?或者这是否意味着我们在运行 awk 脚本时必须传递 progfile?如果是这样的话,在脚本中指定 -f 选项不是多余的吗?如果我们不指定 progfile,-f 选项是否会默认被忽略或抛出错误?
为了更好地理解这一点,我编写了一个简单的 awk 脚本并将其保存为 test.awk
#!/usr/bin/env awk -f
BEGIN { print "START" }
Run Code Online (Sandbox Code Playgroud)
当我运行它时,字符串“START”会打印在屏幕上。
prachis-mbp-2:~ pskhadke$ ./test.awk
START
Run Code Online (Sandbox Code Playgroud)
如果我从 awk 脚本的第一行删除该-f选项并运行它,则会收到以下错误:
prachis-mbp-2:~ pskhadke$./test.awk
awk: syntax error at source line 1
context is
>>> . <<< /test.awk
Run Code Online (Sandbox Code Playgroud)
相似地,
prachis-mbp-2:~ pskhadke$ awk test.awk
awk: syntax error at source line 1
context is
>>> test. <<< awk
awk: bailing out at source line 1
Run Code Online (Sandbox Code Playgroud)
因此,由于某种原因,如果没有该选项,它无法正确解析参数-f。但为什么?
小智 5
文件名附加到 shebang 行中命令的末尾。test.awk因此,对带有标头的文件有效执行的结果命令#!/usr/bin/env awk -f行将是awk -f test.awk,处理test.awk要执行的脚本文件而不是数据输入文件。
最好的说明:创建一个test包含唯一内容的文件#!/bin/rm,使其可执行(例如chmod 755)并尝试通过运行来执行它./test。现在,该文件去了哪里:)