为什么AWK使用我的参数作为输入文件

时间:2015-08-06 09:38:33

标签: linux awk

我正在写一个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:致命:无法打开文件`type1'进行阅读(没有   文件或目录)

我只想让参数“type1”作为我脚本中的变量,而不是用于解析的输入文件。我怎么能不让awk把它当作一个imput文件?

谢谢,

3 个答案:

答案 0 :(得分:4)

不要使用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"

答案 1 :(得分:2)

从ARGV中删除非文件选项:

delete ARGV[2]
delete ARGV[3]

答案 2 :(得分:1)

如果要将它们用作变量,则必须使用-v参数。您尝试这样做的方式,建议第二个参数是输入/输出文件