awk 引号与变量问题 求详解

2025-03-20 10:39:24
推荐回答(1个)
回答1:

你的问题实际上牵扯到 awk 和 bash 中对引号的处理。
先说 "为什么awk打印字符串my test 需要双引号“my test”
awk 打印字符串,字符串必须用双引号括起来。 如果不扩,比如 awk '{print my test}', awk 会认为你是要打印变量 my 和 test 的值。 比如
echo 'aaa' | awk '{my=12; test=13; print my test}'
你会得到
1213

然后再说 echo 'aaa' | awk '{ print "'"$c"'" }' //放大 " ' " $c " ' "

这里,用 单引号将整个 awk 命令括起来,这个没什么问题。 由于你要 awk 打印的是 bash 变量 c 的内容, 如果直接 awk '{print "$c"}', 由于 $c 是在单引号中,bash不会将 $c 替换成其值,相当于让 awk 直接打印字符串 $c。

为了能够既保证 awk print 语句后面的字符串被 双引号抱起来,又让 $c 被bash替换成 c 的值,你的命令里才会出现那么多引号,并将awk命令分成了好几个部分,

第一部分, '{print "' ; 即 {print 以及要打印字符串的左边的双引号
第二部分, "$c"; 由于是双引号,所以bash会将 $c 替换成 c 的值
第三部分, '"}' ; 即 print 要打印的字符串的右边的双引号和括号

这三部分连起来就构成了了完整的 awk 命令。

但是,我认为可以有更易读的方法来解决你这个问题,比如利用 bash 的 eval
cmd="echo 'aaa' | awk '{print \"$c\"}'"
eval $cmd

或者用双引号将awk命令括起来
echo 'aaa' | awk "{print \"$c\"}"