将awk嵌入shell脚本中

时间:2013-02-22 08:41:51

标签: bash awk

我一直在使用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

而不是传统的:

awk '{
my script commands
' ${intputfile}

当然,我可以将它们写入文件,但重点不是。有什么建议吗?

编辑:虽然dogbane的答案工作正常,但下一个问题是使用&lt;&lt;'HERE'标签,不会读取换行符。我不能取消引用它,否则,他正试图解释awk脚本然后遇到一个$符号(并且有)。并且没有换行符,我无法在awk脚本中发表任何评论(在删除换行符时没有评论一半脚本...)。任何人?

<< 'EOF'
BEGIN{#Hello
print $1
}
EOF # Is read as BEGIN{#Hello print $1} by awk; ie BEGIN{

<< EOF
BEGIN{#Hello
print $1
}
EOF #Is read correctly by awk but Bash tried to express $1 and fails

3 个答案:

答案 0 :(得分:11)

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

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

awk "$scriptVariable" ${inputfile}

答案 1 :(得分:2)

围绕awk脚本的单引号在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中删除,然后从another_file中删除并输出包含dummy的行,并将第一个字段替换为bash脚本的第一个字段。请注意,bash变量$ 1必须是不加引号的。

答案 2 :(得分:1)

您可以使用Here-Document将您的awk包含在bash脚本中。