如何在awk动作中增加一个shellvariables

我的shell脚本是这样的:

#!/bin/bash global_var=0 func() { awk '$1 ~/^pattern/ {global_var=$((global_var+1))}' $1 } func input_file_name 

我想在awk动作中增加全局(shell)variablesglobal_var 。 怎么做? 正常的shell风格增加似乎没有工作。

尝试这个:

 func() { awk '$1~/^pattern/ {++awk_var} END {print awk_var+0}' "$1" } shell_var=$(func input_file_name) 

shell和awk是独立的世界,你应该把它们当作 (*)(实际上,你已经在做这个了,把awk程序用引号括起来,这样可以防止shell扩展任何shell变量引用你的akw程序字符串 )。

因此, 使用awk [-internal]变量执行计数( awk_var并在输入文件完成处理后输出(在END块中, 使用printawk变量输出到stdout+0部分用于确保如果发现NO匹配,则输出默认为0 )。

请注意,通常awk变量不需要显式初始化,因为它们在数字和布尔上下文中默认为0 ,在字符串上下文中为"" (空字符串)。

另请注意, awk具有自己的语法 ,而用于算术扩展的shell结构(例如$((...))不适用 。 一般来说, awk变量只是通过名称 (无$前缀)来引用,而像++这样的算术运算可以直接应用。

然后在shell中使用命令替换 – $(...) – 可以捕获awk命令的输出

在你的具体情况下,你不需要将变量值传递给awk程序,但是如果你需要这样做的话,你可以使用awk-v选项的一个或多个实例。 例如: awk -v awk_var="$shell_var" ...

在shell( bash )方面,如果你想把awk的输出添加到shell变量中,而不是仅仅指定它:

 declare -i shell_var # make sure variable is an integer shell_var+=$(func input_file_name) # add function's output to existing value 

(*) shell和awk有完全独立的命名空间,没有直接的交互方式: awk没有shell变量的概念,shell没有awk变量的概念。

这在技术上可行的,但不建议将shell变量VALUES集成到awk程序中 – 通过使用引号字符串来表示awk程序,在该程序中引用shell变量VALUES ,然后由shell ONCE进行扩展。字符串作为程序传递给awk
你不能做的是从awk程序中修改一个shell变量。

由于awk程序的哪些部分由shell awk解释,哪些部分是由awk稍后解释(例如'$也有特殊含义),它会很快变得复杂, 最好的方法是:

  • 使用引号字符串来表示awk程序,以防止它被shell解释
  • 如果需要传入值,请使用-v选项的实例
  • 如果需要传递的东西,从awk打印到stdout ,并使用命令替换或重定向通过shell捕获它。