shell获取awk内部变量的处理办法

方法一:拼凑法

该方法的思路是:利用awk的print函数去拼凑一个shell赋值语句,然后再用shell去执行
举个例子:

date +%y-%m-%d|awk -F- '{print $1,$2,$3}'

可以得到年月日的输出结果:

21 03 01

此时,如果在shell中,需要分别保存年月日三个变量以备后用,该如何解决?
此时,我们就需要构建一个赋值语句,类似于a=xx b=xx c=xx
经过思考,我们可以改造上述例子

date +%y-%m-%d|awk -F- '{print "year="$1" month="$2" day="$3}'

(注意:此地需要使用“”把除了$1,$2...这样的字符单独扩起来)
输出结果为:

year=21 month=03 day=01

此时已经输出了一个类似赋值语句的字符串,我们需要将它作为语句再执行一次就可以得到year,month,day三个变量了,这里我们可以用eval 来处理,给上面例子继续改造,如下:

eval $(date +%y-%m-%d|awk -F- '{print "year="$1" month="$2" day="$3}')

相当于

eval "year=21 month=03 day=01"

此时我们可以测试下

echo $year $month $day

输出

2021 03 01

已经得到想要的结果了。

方法二,使用read命令

依然以上述需求为例
我们可以使用read命令来接收awk内部变量,如下

read year month day< <(date +%Y-%m-%d|awk -F- '{print $1,$2,$3}')

(注意:两个<之间有空格,后一个<与(之间没有空格,不然会报错)
此时我们也可以得到year,month,day三个变量
我对这个例子的理解是,先执行()中的子shell,然后将其执行结果重定向到一个匿名管道,然后read再从该匿名管道内读取其中的书句赋值给变量。

猜你喜欢

转载自blog.51cto.com/3823536/2642843