编写一个几乎包含Awk脚本的shell脚本。我想在awk部分中使用我的语法着色,所以我觉得必须有更好的方法将awk脚本嵌入bash而不仅仅是引用脚本。
或者它是在单独的文件上开发awk并在bash脚本中使用awk -f
直到脚本完成的最佳方法吗?我想一直保留在一个文件中!
#!/bin/bash
awkscript='
BEGIN{
print "test"
}
{print $3}'
df | awk "$awkscript"
这是引用方式,如果你问我,那很难看。这里有什么机会吗?
答案 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而不是扩展。