【问题标题】:Why AWK uses my arguments as input file为什么 AWK 使用我的参数作为输入文件
【发布时间】:2015-08-06 09:38:32
【问题描述】:

我正在编写一个 awk 脚本,让它为我解析一些东西。为了方便起见,我希望 awk 脚本可以在 linux 中执行。这是我的代码:

#!/usr/bin/awk -f 
BEGIN {
        FILENAME=ARGV[1]
        sub_name=ARGV[2]
        run=ARGV[3]
        count=0           
}

{ 
        if ($4 == "ARGV[2]" && $8 == ARGV[3])
        {
              print $15
              count=count+1
        }
}

END {
      print count
}

当我在 linux 中发出我的 awk 脚本时,例如:

./my_script 001.log type1 2

awk 会说:

awk: ./awk_script:23: fatal: 无法打开文件 `type1' 进行读取(没有这样的 文件或目录)

我只想让参数“type1”作为我脚本中的变量,而不是用于解析的输入文件。如何不让 awk 将其视为输入文件?

谢谢,

【问题讨论】:

    标签: linux awk


    【解决方案1】:

    不要使用 shebang 来执行 awk 脚本,因为它只会使事情复杂化:

    /usr/bin/awk -v sub_name="$2" -v run="$3" '
    { 
            if ($4 == sub_name && $8 == run)
            {
                  print $15
                  count=count+1
            }
    }
    
    END {
          print count
    }
    ' "$1"
    

    请注意,您的脚本可以稍微清理一下:

    /usr/bin/awk -v sub_name="$2" -v run="$3" '
    ($4 == sub_name) && ($8 == run) {
        print $15
        count++
    }
    END { print count+0 }
    ' "$1"
    

    【讨论】:

    • 感谢您的详细解答。我认为这个解决方案就像输入命令行指令来执行 awk。使用脚本和 shebang 有什么区别?
    • 如您所见,使用 shebang 您无法将 shell 参数分隔为 awk 变量和文件名。
    【解决方案2】:

    从 ARGV 中删除非文件选项:

    delete ARGV[2]
    delete ARGV[3]
    

    【讨论】:

    • 我认为这是我运行脚本的最简单方法。谢谢@choroba
    • @JamieChou 要清楚,此解决方案将值添加到 ARGV,然后删除它们,而不是如果您根本不使用 shebang,则首先不将它们添加到 ARGV。
    【解决方案3】:

    如果你想将它们用作变量,那么你必须使用 -v 参数。您尝试这样做的方式表明第二个参数是输入/输出文件

    【讨论】:

    • 你的意思是我需要把我的输入放在我的脚本的第一行吗?如果我只是将第一行从 -f 更改为 -v,我会收到来自 awk 的错误消息。在我看来, -v 在将变量附加到第一行时起作用。您能否提供有关使用 -v 的更多信息?谢谢。
    • 看来这个解决方案类似于@Morton 的解决方案。谢谢。
    猜你喜欢
    • 2022-06-15
    • 2019-07-14
    • 2013-03-22
    • 2014-08-14
    • 2020-11-28
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多