【问题标题】:Specify other flags in awk script header在 awk 脚本头中指定其他标志
【发布时间】:2020-07-14 23:15:08
【问题描述】:

我想使用#!/bin/awk -f 标头编写一个awk 脚本文件,但我希望此脚本始终使用: 作为字段分隔符。但是由于某种原因,写#!/bin.awk -F: -f 给了我一个语法错误。我还希望这个脚本始终在同一个文件上运行,所以我也想对其进行硬编码。基本上,我想要的工作是这样的:

#!/bin/awk -F: -f -- /etc/passwd

后面是一些 awk 代码

【问题讨论】:

  • 看起来问题在于不同的 Linux/Unix 系统没有一致地传递 shebang 参数。这篇文章提供了一些适用于各种系统的建议解决方法:stackoverflow.com/questions/4303128/…

标签: bash awk


【解决方案1】:

许多系统只允许在 shebang 行中使用单个参数,因此空格之后的所有内容都作为一个参数传递。

但是,您可以在脚本的 BEGIN 块中设置 FS 甚至 ARGV,如下所示:

#!/bin/awk -f              # using the #!/bin/awk -f
BEGIN {
    FS=":"                 # always use : as a field separator
    ARGC=2
    ARGV[1]="/etc/passwd"  # always run on the same file
}
$3==0 {                    # followed by some awk code
    print $1
}

运行它:

$ chmod u+x program.awk
$ ./program.awk
root

【讨论】:

    【解决方案2】:

    永远不要使用 shebang 来调用 awk,因为这与简单地在 shell 脚本中调用 awk 相比没有任何有价值的好处,但会剥夺你将传递给 shell 脚本的参数分离为 shell 处理的值的能力,awk 的值进程使用-v,awk 的值使用脚本末尾的分配和文件名来处理,以便 awk 在其上运行。

    只写:

    #!/usr/bin/env bash
    awk -F':' '
    whatever
    ' /etc/passwd
    

    这样,如果你有必要,你可以简单地将其调整为:

    #!/usr/bin/env bash
    sort "$1" |
    awk -F':' -v foo="$2" '
    whatever
    ' - FS="$3" "$4"
    

    或者您需要做的任何其他事情来最恰当地使用传递给您的 shell 脚本的参数并进行增强(例如,添加输入的初始排序),而无需更改脚本的调用者。

    【讨论】:

    • 这个问题从来没有说 awk 脚本是从 shell 运行的。你是怎么推断的?
    • @TobySpeight 该问题标有bash,包括一个shebang,并使用/etc/passwd作为输入。
    • 啊,bash 标签 - 这很有意义。谢谢。 (很明显,其他的东西并不能区分从其他非 shell 程序运行,但确实如此)。
    • @TobySpeight 不客气。我认为这是“证据优势”:-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多