标签:awk

shell awk 传参

No Comments 脚本技巧

在写shell脚本时,经常会使用到awk程序。但是有些复杂的逻辑,可能需要在awk中使用在shell中定义的变量,而且awk程序处理之后,产生的中间变量,还需要在shell中继续处理。

 

一、那如何在awk中使用在shell中定义的变量呢?

方法一:使用"’把shell变量包起来,即"’$var’";注意是“双引号+单引号+shell变量+单引号+双引号”的格式。

这种写法大家无需改变用’括起awk程序的习惯,是老外常用的写法;这种写法其实际是双括号变为单括号的常量,传递给了awk.

例如:

var="abc"

awk ‘BEGIN{print "’$var’"}’

 

方法二:和方法一类似,但使用"’"把shell变量包起来,即"’"$var"’";注意是“双引号+单引号+双引号+shell变量+双引号+单引号+双引号”的格式。

如果变量的值中包含空格,为了shell不把空格作为分隔符,则应使用方法二。

例如:

var="this a test"

awk ‘BEGIN{print "’"$var"’"}’

------中间广告---------

 

方法三:export变量,然后在awk中使用ENVIRON["var"]形式获取环境变量的值

例如:

var="this a test"; export var;

awk ‘BEGIN{print ENVIRON["var"]}’ 

 

方法四:使用awk -v选项;

当变量不是很多时,建议使用这种方式。

例如:
var="this a test"

awk -v awkVar="$var" ‘BEGIN{print awkVar}’

二、那shell中如何使用awk程序中定义的变量呢?

“由awk向shell传递变量”,其思想无非是用awk(sed/perl等也是一样)输出若干条shell命令,然后再用shell去执行这些命令。

例如:

eval $(awk ‘BEGIN{print "var1=’str1′;var2=’str2’"}’)
或者eval $(awk ‘{printf("var1=%s; var2=%s; var3=%s;",$1,$2,$3)}’ abc.txt)

之后可以在当前shell中使用var1,var2等变量了。
echo "var1=$var1 —– var2=$var2"
———————
作者:rj042
来源:CSDN
原文:https://blog.csdn.net/rj042/article/details/72860177
版权声明:本文为博主原创文章,转载请附上博文链接!

awk与cut在以空格为分割域时的区别

No Comments 脚本技巧

cut是以单个空格作为分隔符。 CUT无法取值多空格的情况。

——举例—————–

[root@]# mysql -h127.0.0.1 -P3346 -S /tmp/mysql3346.sock -e status |grep Uptime|cut -f2 -d":"|cut -d"d" -f1|cut -d" " -f2

[root@]# mysql  -h127.0.0.1 -P3346 -S /tmp/mysql3346.sock -e status |grep Uptime|cut -f2 -d":"|cut -d"d" -f1
            21

awk 以空格为分割域时,是以单个或多个连续的空格为分隔符的;

awk默认以空格为分割域, AWK确可以直接取到正常值

[root@]# mysql -h127.0.0.1 -P3346 -S /tmp/mysql3346.sock -e status |grep Uptime|cut -f2 -d":"|cut -d"d" -f1|awk ‘{print $1}’
21
[root@]# mysql  -h127.0.0.1 -P3346 -S /tmp/mysql3346.sock -e status |grep Uptime|cut -f2 -d":"|cut -d"d" -f1|awk ‘{print $0}’
            21