Bash 在shell脚本中嵌入awk

Bash 在shell脚本中嵌入awk,bash,awk,Bash,Awk,我一直在使用一个bash脚本(script.sh),它使用各种awk脚本(script1.awk、script2.awk),这些脚本是在“运行时”定制的,例如替换值。 我一直在寻找将它们完全嵌入到第一个bash脚本中的方法。 理想情况下,我希望有一个如下所示的文件: ################################ # AWK scripts # ################################ read -d '' script

我一直在使用一个bash脚本(script.sh),它使用各种awk脚本(script1.awk、script2.awk),这些脚本是在“运行时”定制的,例如替换值。 我一直在寻找将它们完全嵌入到第一个bash脚本中的方法。 理想情况下,我希望有一个如下所示的文件:

################################
# AWK scripts                  #
################################
read -d '' scriptVariable <<'EOF'
'
{my block commands;}
'
EOF
################################
# End of AWK Scripts           #
################################
awk $scriptVariable ${inputfile} # This line obviously doesn't work
当然,我可以将它们写入一个文件,但关键不是这样。有什么建议吗


编辑:虽然dogbane answers可以正常工作,但下一个问题是,使用可以在bash脚本中包含awk,方法是使用。

删除awk脚本周围的单引号,并将脚本变量用双引号括起来。这对我很有用:

################################
# AWK scripts                  #
################################
read -d '' scriptVariable << 'EOF'
BEGIN {
    print "start"
}
{
    print $0
}
END{
    print "hello"
}
EOF
################################
# End of AWK Scripts           #
################################

awk "$scriptVariable" ${inputfile}
################################
#AWK脚本#
################################

read-d''scriptVariableawk脚本周围的单引号在shell中可能很难理解

echo dummy code | awk '/dummy/{print '$1' $2}' - another_file | while read LINE; do
    case $LINE in
        "$1 code")echo success;;
        *)echo $LINE;;
    esac
done

这将从stdin中删除,然后从包含dummy的另一个_文件和输出行中删除,并用bash脚本的第一个参数替换第一个字段。请注意,bash变量$1必须是不带引号的。

它与
awk“$scriptVariable”${inputfile}一起工作吗
听起来您只需要将脚本语言升级到更好的版本—Perl或Python。它将更简单,工作速度更快。已经尝试过了,但失败了,原因是
awk:source line 1上下文的语法错误为>>>“当您可以使用
scriptVar='…'设置变量时,为什么要读取该变量?
或者更好的做法是跳过变量的整个设置,只使用
awk'…”文件
?@technosaurus 1.因为我的字符串中有讨厌的字符(',“,…)。2.因为我想分离bash代码和awk代码。关于这一点的提示,请使用
-f-
选项,如
awk-f-为什么需要第二个字符?Bruno的回答对我来说很有用。要将shell变量传递给awk脚本,请使用awk的“-v”“选择权。类似于:
var v1=“shell value”awk-v awkVar=“$v1”“$scriptVariable”${inputfile}
在脚本中,“awkVar”将保存值“shell value”
################################
# AWK scripts                  #
################################
read -d '' scriptVariable << 'EOF'
BEGIN {
    print "start"
}
{
    print $0
}
END{
    print "hello"
}
EOF
################################
# End of AWK Scripts           #
################################

awk "$scriptVariable" ${inputfile}
echo dummy code | awk '/dummy/{print '$1' $2}' - another_file | while read LINE; do
    case $LINE in
        "$1 code")echo success;;
        *)echo $LINE;;
    esac
done