将 awk 变量导出到 bash 变量?

Exporting awk variables to bash variables?

我想将我在使用 awk 处理文本文件时计算出的一些值保存到 bash 变量中。例如,如果我的 file.txt 有以下

total 16  
dr-xr-xr-x  18 root root  257 Mar 26 16:24 .  
dr-xr-xr-x  18 root root  257 Mar 26 16:24 ..  
-rw-r--r--   1 root root    0 Mar 24 22:23 .autorelabel   
lrwxrwxrwx   1 root root    7 Mar 18 08:15 bin -> usr/bin  
dr-xr-xr-x   4 root root 4096 May 20 17:05 boot  
drwxr-xr-x  14 root root 2860 Apr 17 03:09 dev  
drwxr-xr-x  95 root root 8192 May 20 17:05 etc  

如果我想计算第五列的总和和我会做的隐藏文件的数量

awk 'NR>1 {sum+=; if(substr(,1,1)=="."){count+=1}} END{print "The disk space is " sum " and the number of hidden files is " count}' file.txt  

输出

The disk space is 15669 and the number of hidden files is 3

我想做的是保存变量 sumcount 以供以后在我的脚本中使用,而不必进行每次计算再次,例如像做 SUM=$(awk '{sum+=} END{print sum}' file.txt)

我知道你可以使用 -v 选项将 bash 变量传递给 awk,但我想做相反的事情,比如 awk 中的“{export SUM=sum}”。

您可以 read 从进程替换的输出中:

read sum count < <(
    awk '
        NR > 1 {sum += ; if (substr(,1,1) == ".") count++}
        END {print sum, count}
    ' file.txt
)

关于 I know you can pass bash variables to awk using the -v option - 不完全是。您可以使用 -vawk 变量 初始化为包含 bash 变量的 value 的字符串,但 awk 不是在访问 bash 变量之前,bash 正在访问 bash 变量以在调用 awk 之前填充 -v... 部分。 bash 无法访问 awk 变量 - 如果您想根据 awk 变量的值设置一些 bash 变量,那么您需要从 awk 打印这些 awk 变量的值并读取bash 中的那些值,例如将所有 awk 输出值读入 bash 数组:

$ awk 'BEGIN{foo=7; bar="stuff"; print foo; print bar}'
7
stuff

$ out=( $(awk 'BEGIN{foo=7; bar="stuff"; print foo; print bar}') )

$ echo "${out[0]}"
7
$ echo "${out[1]}"
stuff