linux - 了解 shebang 行中的 awk -f 选项

标签 linux awk

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

根据我的理解,这意味着 awk 通过搜索具有 progfile/prog 中指定模式的行来处理输入文件,具体取决于您是否对 awk 使用 -f 选项。并且根据使用的模式,对输入文件中找到的行执行关联的操作。我的问题是……在运行 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 行中命令的末尾。因此,对于标题为 #!/usr/bin/env awk -f 的文件 test.awk 有效执行的结果命令行将是 awk -f test .awk,将 test.awk 视为要执行的脚本文件,而不是数据输入文件。

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

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

相关文章:

Linux - 在 Rstudio : libjvm. 中加载 rJava 时出错,所以 : missing?

bash - AWK:如何确定 awk 的 system() 命令中使用的 shell?

csv - 使用awk有效解析CSV的最健壮方法是什么?

linux合并两个文件不重复

php - 可以使用终端访问 mysql 数据库,但使用 php 时收到 "access denied"消息

linux - 什么代码不应该写成实时代码?

linux - 随 secret 码变量消失

awk - 仅当 '\n' 的出现多于一个数字时,才用空格替换 '\t'

linux - 在此 awk 命令中应该将 'RS' 设置为什么

linux - 使用 Expect 填写多行提示