我正在阅读某人的 awk 脚本。从头文件 #!/usr/bin/env awk -f 开始。 env 命令没有 -f 选项。因此,他们必须为 awk 命令传递 -f 选项。我查看了 awk 的手册页。它说 Awk 扫描每个输入文件以查找与 prog 或指定为 -f progfile 的一个或多个文件中逐字指定的一组模式中的任何一个匹配的行。对于每个模式,可以有一个关联的操作,当文件的一行与该模式匹配时将执行该操作。

根据我的理解,这意味着 awk 通过搜索具有在 progfile/prog 中指定的模式的行来处理输入文件,具体取决于您是否将 -f 选项与 awk 一起使用。并且基于所使用的模式,在输入文件中找到的行上执行关联的操作。我的问题是...在运行 awk 脚本文件时这是如何工作的?我们没有在 #!/usr/bin/env awk -f 行中指定 progfile。 awk 脚本将使用哪些模式?或者这是否意味着我们在运行 awk 脚本时必须传递 progfile?如果是这种情况,是否在脚本中指定 -f 选项是多余的?如果我们不指定 progfile,默认情况下会忽略 -f 选项还是抛出错误?

为了更好地理解这一点,我编写了一个简单的 awk 脚本并将其保存为 test.awk

#!/usr/bin/env awk -f

BEGIN { print "START" }

当我运行它时,字符串“START”被打印在屏幕上。
prachis-mbp-2:~ pskhadke$ ./test.awk
START

如果我从 awk 脚本的第一行中删除 -f 选项并运行它,我会收到以下错误:
prachis-mbp-2:~ pskhadke$./test.awk
awk: syntax error at source line 1
 context is
     >>> . <<< /test.awk

相似地,
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

因此,出于某种原因,如果没有 -f 选项,它就无法正确解析参数。但为什么?

最佳答案

该文件的名称附加到命令的末尾 shebang 行。因此,对带有头文件 test.awk 的文件 #!/usr/bin/env awk -f 有效执行的结果命令行将是 awk -f test.awk ,将 test.awk 视为要执行的脚本文件而不是数据输入文件。

最好的例子:创建一个文件 test 作为唯一内容 #!/bin/rm ,使其可执行(例如 chmod 755 )并尝试通过运行 ./test 来执行它。现在,那个文件去了哪里:)

关于linux - 了解 shebang 行中的 awk -f 选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34009196/

10-16 20:38