Linux 如何在awk操作中增加shell变量
我的shell脚本如下所示:Linux 如何在awk操作中增加shell变量,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我的shell脚本如下所示: #!/bin/bash global_var=0 func() { awk '$1 ~/^pattern/ {global_var=$((global_var+1))}' $1 } func input_file_name 我想在awk操作中增加全局(shell)变量global\u var。如何做到这一点?正常的shell样式递增似乎不起作用。尝试以下操作: func() { awk '$1~/^pattern/ {++awk_var} END {pr
#!/bin/bash
global_var=0
func() {
awk '$1 ~/^pattern/ {global_var=$((global_var+1))}' $1
}
func input_file_name
我想在awk
操作中增加全局(shell)变量global\u var
。如何做到这一点?正常的shell样式递增似乎不起作用。尝试以下操作:
func() {
awk '$1~/^pattern/ {++awk_var} END {print awk_var+0}' "$1"
}
shell_var=$(func input_file_name)
shell和awk
是两个独立的世界,您应该这样对待它们(*)(实际上,您已经这样做了,将awk
程序用单引号括起来,这样可以防止shell扩展akw
程序字符串中的任何shell变量引用)
因此,使用awk
[-internal]变量执行计数(awk\u var
)并在处理完输入文件后输出它(在END
块中,使用print
将awk
变量输出到stdout
,+0
部分用于确保在未找到匹配项的情况下,输出默认为0
。)
请注意,通常,awk
变量不需要显式初始化,因为它们在数字和布尔上下文中默认为0
,在字符串上下文中默认为”
(空字符串)
还要注意的是,awk
有自己的语法,用于算术展开的$(…)
等shell构造不适用。通常,awk
变量仅按名称引用(无$
前缀),可以直接应用++
等算术运算
在shell中使用命令替换-$(…)
-可以捕获awk
命令的输出
在您的特定情况下,您不需要将变量值传递到awk
程序中,但如果需要,您可以使用awk
的-v
选项的一个或多个实例;e、 g.:awk-v awk_var=“$shell_var”…
在shell(bash
)端,如果您想将awk
的输出添加到shell变量,而不是只分配它:
(*)shell和
awk
具有完全独立的名称空间,它们之间没有直接的交互方式:awk
没有shell变量的概念,shell也没有awk
变量的概念。
在技术上是可行的,但不建议将shell变量值集成到awk
程序中-使用双引号字符串表示awk
程序,在该程序中引用shell变量值,然后在字符串作为程序传递给awk
之前,shell对这些变量值展开一次您不能做的是从
awk
程序内部修改shell变量
由于前期由shell解释的awk
程序的哪些部分与后期由awk
解释的部分(例如,“$
也有特殊含义)变得很复杂,最佳方法是:
- 使用单引号字符串表示
程序,以防止shell对其进行解释awk
- 如果需要传入值,请使用
选项的实例-v
- 如果需要发送某些内容,请从
打印到awk
,并使用命令替换或重定向通过shell捕获它stdout
awk
命令中,访问变量时不需要使用$
。@WKPlus:一般来说是这样,但这里的问题是试图从awk
程序内部访问shell变量(使用shell语法,但这是次要问题)。问题不仅在于从awk
脚本内部访问shell变量,还在于尝试从awk
脚本内部修改shell变量。如果导出全局变量
,则可以从环境[“全局变量”]
初始化awk变量
。并不是说这是一个好主意,特别是因为这是一次单程旅行,但awk程序至少可以访问环境变量。也许这比帮助更让人困惑。不确定为什么要使用printf而不是print,但在任何情况下都可能是awk'$1~/^pattern/{++awk_var}END{print awk_var+0}
+1谢谢你的详细解释。@rici:这是一个有趣的选择,也很好知道,但既然这是一条单行道,你也可以使用-v…
@EdMorton谢谢,谢谢你在回答中添加了+0
提示。我使用了printf
,知道结果将被捕获到一个变量中,但我同意这可能会让人困惑(通常没有格式字符串就不那么安全),所以我切换到print
。我认为最后一条语句应该是((shell\u var+=$(func input\u file\u name))
。否则awk应该有-v“awk\u var=$shell\u var”
。
declare -i shell_var # make sure variable is an integer
shell_var+=$(func input_file_name) # add function's output to existing value