awk正则表达式使用外部变量

awk正则表达式使用外部变量

awk的正则表达式匹配中,如果要使用外部shell
变量,先在变量外加双引号,再加单引号即可,如:


for i in read write print; 
do 
cat file.txt | awk '{ if ($7~/'"$i"'/) {print $0} }'| wc -l ; 
done


在写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程序中定义的变量呢?


awkshell传递变量,其思想无非是用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"


  • 发表于 2024-02-04 11:35
  • 阅读 ( 978 )
  • 分类:linux

0 条评论

请先 登录 后评论
omicsgene
omicsgene

生物信息

698 篇文章

作家榜 »

  1. omicsgene 698 文章
  2. 安生水 347 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. xun 82 文章
  6. 红橙子 78 文章
  7. rzx 74 文章
  8. CORNERSTONE 72 文章