Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在awk操作中增加shell变量_Linux_Bash_Shell_Awk - Fatal编程技术网

Linux 如何在awk操作中增加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

我的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 {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
解释的部分(例如,
“$
也有特殊含义)变得很复杂,最佳方法是:

  • 使用单引号字符串表示
    awk
    程序,以防止shell对其进行解释
  • 如果需要传入值,请使用
    -v
    选项的实例
  • 如果需要发送某些内容,请从
    awk
    打印到
    stdout
    ,并使用命令替换或重定向通过shell捕获它

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