你能用heredocuments在一个bash脚本中嵌入AWK吗?

时间:2011-06-27 07:51:33

标签: bash awk

编写一个几乎包含Awk脚本的shell脚本。我想在awk部分中使用我的语法着色,所以我觉得必须有更好的方法将awk脚本嵌入bash而不仅仅是引用脚本。

或者它是在单独的文件上开发awk并在bash脚本中使用awk -f直到脚本完成的最佳方法吗?我想一直保留在一个文件中!

#!/bin/bash
awkscript='
BEGIN{
    print "test"
}
{print $3}'
df | awk "$awkscript"

这是引用方式,如果你问我,那很难看。这里有什么机会吗?

6 个答案:

答案 0 :(得分:23)

是的,在Bash中,这可能会稍微不那么丑陋:

#!/bin/bash
df | awk -f <(cat - <<-'EOD'
        BEGIN{
            print "test"
        }
        {print $3}
EOD
)

<()代码块被替换为路径(类似/dev/fd/63),它指向与代码输出相关联的文件描述符。确保awk脚本缩进了标签而不是空格(<<-剥离前导标签)。

另一种方法是在bash脚本的末尾隐藏awk脚本(不要忘记exit):

#!/bin/bash
df | awk -f <(sed -e '0,/^#!.*awk/d' $0)
exit $PIPESTATUS

#!/usr/bin/awk -f
BEGIN {
    print "test"
}
{print $3}

答案 1 :(得分:6)

丑陋的:

read -r -d '' awkscript <<'EOF'
BEGIN{ print "test"}
{print $3}
EOF
df | awk "$awkscript"

答案 2 :(得分:4)

如果您不想将stdin用于数据,请执行此操作 - 它是可移植的,快速的,并且不使用任何基础知识。

awk -f- inputfile.txt <<'EOF'
BEGIN {
  print "hello world"
}
EOF

告诉awk使用-的输入文件名会导致它从stdin读取脚本。

当然,您现在必须将数据存储在一个文件中。如果确实无法执行此操作,请使用命名管道。

f=/tmp/$$.data
trap "rm -f $f" EXIT
mknod $f p
(df > $f) &
awk -f- $f <<EOF
{ print }
EOF

答案 3 :(得分:3)

不确定你的意思,但是你在找这样的东西吗?

#!/bin/bash

awk 'BEGIN {
    print "hello world"
}
{ 
    print $3
}' <<< "$(df)"

请参阅bash手册中的3.6.7 Here Strings

答案 4 :(得分:0)

有时这可能有用:

awkscript=$(cat << EOT
BEGIN{
    print "test"
}
{print $3}
EOT
)

df | awk "$awkscript"

答案 5 :(得分:0)

一种方法是让awk使用(heredoc或here string)从stdin读取规则,但处理由子进程替换创建的真实文件或文件,如下所示

awk -f- <(df) <<'EOF'
BEGIN{
    print "test"
}
{print $3}
EOF

-f-应出现在<(df)之前。应该引用heredoc的分隔符,以便将$符号传递给awk而不是扩展。