18

我一直在使用一个 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 答案工作正常,但下一个问题是使用 <<'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
4

3 回答 3

17

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

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

awk "$scriptVariable" ${inputfile}
于 2013-02-22T09:12:17.500 回答
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 必须不加引号。

于 2013-02-22T09:18:14.593 回答
1

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

于 2013-02-22T08:54:19.743 回答