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

use*_*266 3 linux bash shell awk

我的shell脚本是这样的:

#!/bin/bash

global_var=0

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

func input_file_name
Run Code Online (Sandbox Code Playgroud)

我想增加全球(壳)可变global_var的内部awk动作.怎么办?正常的shell样式递增似乎不起作用.

mkl*_*nt0 9

试试这个:

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

shell_var=$(func input_file_name)
Run Code Online (Sandbox Code Playgroud)

awk是独立的世界,你应该这样对待他们(*)(其中,实际上,你已经在做,通过封闭的awk程序引号,这样可以防止外壳展开任何在变量引用akw程序字符串).

因此,使用awk[-internal]变量执行您计数(awk_var)它已经完成处理输入文件(在后和输出END块,使用print输出awk变量stdout -的+0部分是保证输出缺省为0万一NO匹配被发现.)

请注意,通常,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
Run Code Online (Sandbox Code Playgroud)

(*)shell并且awk具有完全独立的命名空间,这些命名空间没有直接相互交互的方式:awk没有shell变量的概念,shell没有awk变量的概念.

技术上可行的,但是将shell变量VALUES集成到awk程序中是不明智的- 通过使用引号字符串来表示awk引用shell变量VALUES的程序,然后由shell ONCE 扩展,在字符串获取之前作为一个程序传递给awk.
你不能做的是从程序内部修改 shell变量awk.

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

  • 使用引号字符串来表示awk程序,以保护它免受shell的解释
  • 如果值需要传递,使用的情况下,-v选择
  • 如果有什么需要传递出来,打印到stdoutawk和使用命令替换或重定向通过壳捕捉到它.