如何在命令行上预先构造awk语句传递给awk?

Mar*_*n08 3 shell awk cygwin

我有一个shell脚本,它将一个awk程序构造为一个字符串,然后将该字符串传递给awk.这是因为我想在awk程序中使用shell变量的值.

我的代码看起来像这样:

awk_prog="'{if (\$4~/$shell_var/) print \$1,\$2}'"
echo $awk_prog
awk $awk_prog $FILENAME
Run Code Online (Sandbox Code Playgroud)

但是,当我将字符串传递给awk时,我总是得到错误:

'{if ($4~/regex/) print $1,$2}'
awk: '{if
awk: ^ invalid char ''' in expression
Run Code Online (Sandbox Code Playgroud)

该错误消息的含义是什么?我尝试了-F:开关,但没有帮助.我该如何解决这个问题?

谢谢.

D.S*_*ley 5

这是由shell引用引起的.以下将有效:

awk_prog="{ if (\$4 ~ /$shell_var/) print \$1, \$2 }"
echo "$awk_prog"
awk "$awk_prog" $FILENAME
Run Code Online (Sandbox Code Playgroud)

当你从命令行运行时awk '{ print }' foo,shell解释并删除程序周围的引号,因此awk接收两个参数 - 第一个是程序文本,第二个是文件名foo.你的例子是发送awk程序文本'{if ...}',就awk而言,这是无效的语法.外部引号不应存在.

在上面给出的代码片段中,shell使用行中的引号awk_prog=将字符串的内容分组为单个值,然后将其分配给变量awk_prog.当它执行该awk "$awk_prog"...行时,你必须引用扩展,$awk_prog因此awk接收程序文本作为单个参数.