如何在awk操作中增加shell变量

时间:2014-06-02 02:22:15

标签: linux bash shell awk

我的shell脚本是这样的:

#!/bin/bash

global_var=0

func() {
 awk '$1 ~/^pattern/ {global_var=$((global_var+1))}' $1
}

func input_file_name

我想在global_var操作中增加全局(shell)变量awk。怎么办?正常的shell样式递增似乎不起作用。

1 个答案:

答案 0 :(得分:8)

试试这个:

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

shell_var=$(func input_file_name)

shell和awk是不同的世界,您应该将它们视为(*)(实际上,您已经在做了,通过封闭您的{{1}在引号中编程,这会阻止shell扩展awk程序字符串中的任何 shell 变量引用。 / p>

因此,使用akw [ - internal]变量来执行计数(awk,并在完成处理输入文件后输出{({} 1}}阻止,使用awk_varEND变量输出到print - awk部分是为了确保输出默认为{ {1}}如果未找到匹配项。)

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

另请注意, awk具有自己的语法,而 shell构造(例如0用于算术扩展)不适用。通常,""变量仅通过名称引用 (无awk前缀),并且可以直接应用$((...))等算术运算。

在shell中使用命令替换 - awk - 然后允许您捕获$命令的输出。

在您的特定情况下,您无需将变量值传递到 ++程序,但如果您需要这样做,则需要使用一个或多个{{{ 1}}的{​​{1}}选项;例如:$(...)

在shell(awk)方面,如果您想 awk的输出添加到shell变量而不是分配它:

awk

(*) shell和-v具有完全独立的名称空间,这些名称空间没有直接相互作用的方式:awk -v awk_var="$shell_var" ...没有shell变量的概念,而shell没有概念bash个变量。

通过使用 double VALUES 集成到awk程序中是技术上可行但不明智的 > -quoted字符串表示declare -i shell_var # make sure variable is an integer shell_var+=$(func input_file_name) # add function's output to existing value 程序,在该程序中引用 shell 变量 VALUES ,然后由 shell ONCE进行扩展,在字符串作为程序传递给awk之前 你不能做的是从awk程序中修改一个shell变量。

由于awk程序的哪些部分由shell预先解释而哪些部分由awk稍后解释(其中awk具有特殊含义,因此很快变得复杂起来例如,最佳方法是:

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