是否可以将脚本传递给shell变量中的awk?

时间:2019-04-01 13:47:15

标签: shell awk

是否可以将awk脚本存储在shell变量中;例如:

export script="'{printf(\$2); printf("\"\\n\"");}'"

echo $script
'{printf($2); printf("\n");}'

当我直接调用脚本时,脚本可以正常运行:

awk '{printf($2); printf("\n");}' testFile.txt
prints proper output

当我尝试将脚本作为外壳变量传递时,遇到了问题。

awk $script testFile.txt
awk: syntax error at source line 1
 context is
     >>> ' <<< 
    missing }
awk: bailing out at source line 1

将变量用双引号引起来时,我会得到一个略有不同的错误

awk "$script" testFile.txt
awk: syntax error at source line 1
 context is
     >>> ' <<< 
awk: bailing out at source line 1

我仍在确切地了解shell扩展的工作方式,对于在此缺少的内容,我将不胜感激。

3 个答案:

答案 0 :(得分:4)

报价错误

export script='{printf($2); printf("\n");}'
awk "${script}" YourFile

答案 1 :(得分:0)

我不确定该如何找到正确的答案,但是一个非常丑陋的解决方法(可能取决于$script的内容)是:

echo $script | awk '{print "awk "$0" testFile.txt"}' | bash

这只是在$script语句中打印awk的内容,然后由bash执行。我对此并不感到特别自豪,但是也许有帮助!

答案 2 :(得分:0)

键入

awk '{printf($2); printf("\n");}' testFile.txt

awk仅看到{printf($2); printf("\n");}-外壳删除引号 (请参阅bash手册中的Quote Removal

注意@NeronLeVelu的答案。