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

unp*_*680 10 bash awk

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

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

#!/bin/bash
awkscript='
BEGIN{
    print "test"
}
{print $3}'
df | awk "$awkscript"
Run Code Online (Sandbox Code Playgroud)

这是引用方式,如果你问我,那很难看.这里有heredocs的机会吗?

mss*_*mss 25

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

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

<()代码块被替换的路径(像/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}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢用于多个脚本的cat变体,因为awk代码保持在执行的命令附近.我将后者用于shell脚本,这些脚本或多或少是围绕awk/sed脚本的包装器.见例如.https://github.com/mss/sed-header-filter/blob/master/header-filter.sh用于我曾经掀起的扩展(`sed`)示例. (2认同)
  • `df`不是必需的,但这里的示例命令是awk'ed.用您喜欢的任何命令替换`df`,当然对于awk脚本也是如此. (2认同)

Dav*_*ven 8

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

awk -f- inputfile.txt <<'EOF'
BEGIN {
  print "hello world"
}
EOF
Run Code Online (Sandbox Code Playgroud)

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

当然,您现在必须将数据存储在文件中。如果您实在无法做到这一点,请使用命名管道。

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


jm6*_*666 6

丑陋的:

read -r -d '' awkscript <<'EOF'
BEGIN{ print "test"}
{print $3}
EOF
df | awk "$awkscript"
Run Code Online (Sandbox Code Playgroud)