Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您可以使用heredocuments在bash脚本中嵌入AWK吗?_Bash_Awk - Fatal编程技术网

您可以使用heredocuments在bash脚本中嵌入AWK吗?

您可以使用heredocuments在bash脚本中嵌入AWK吗?,bash,awk,Bash,Awk,编写一个几乎围绕Awk脚本的shell脚本。我想在awk部分中添加我的语法,所以我觉得一定有更好的方法将awk脚本嵌入bash,而不仅仅是引用脚本 或者在单独的文件上开发awk并在bash脚本中使用awk-f,直到脚本完成为止,这是最好的方法吗?我想一直保存在一个文件内 #!/bin/bash awkscript=' BEGIN{ print "test" } {print $3}' df | awk "$awkscript" 这是报价方式,如果你问我的话,相当难看。这里有没有遗传病的

编写一个几乎围绕Awk脚本的shell脚本。我想在awk部分中添加我的语法,所以我觉得一定有更好的方法将awk脚本嵌入bash,而不仅仅是引用脚本

或者在单独的文件上开发awk并在bash脚本中使用
awk-f
,直到脚本完成为止,这是最好的方法吗?我想一直保存在一个文件内

#!/bin/bash
awkscript='
BEGIN{
    print "test"
}
{print $3}'
df | awk "$awkscript"
这是报价方式,如果你问我的话,相当难看。这里有没有遗传病的机会?

也很难看:

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

read-r-d''awkscript不知道你的意思,但是你在找这样的东西吗

#!/bin/bash

awk 'BEGIN {
    print "hello world"
}
{ 
    print $3
}' <<< "$(df)"
#/bin/bash
开始{
打印“hello world”
}
{ 
打印$3

}“是的,在Bash中,这可能以稍微不那么丑陋的方式实现:

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

如果您不想对数据使用stdin,请这样做——它是可移植的、快速的,并且不使用任何bashism

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

有时这可能是有用的:

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

df | awk "$awkscript"

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

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

awk-f-还是用单引号结束整个脚本更好。:@Fredrik的回答包含了对heredocs的强制手动输入。它们自然会被重定向到某个对象的标准。AWK已经使用stdin来读取实际数据,所以没有比这更好的方法了。但是oopsy woopsy——这个解决方案也让bash取代了
$3
,所以你需要避开美元。毕竟不是那种美感!还有9个代表没有解决这个小问题:)嗯。。奇怪,因为我的noobish很糟糕。在实验中,在中间的某个地方,我设法去除了引文。抱歉:fn不是我想的,但是+1'd,因为手册指引了我正确的方向:不可能有多个stdin读取。这是一个很酷的解决方案。使用不同的
sed
命令,可以嵌入多个子脚本。杰出的对于多个脚本,我更喜欢cat变量,因为awk代码停留在执行的命令附近。我将后者用于shell脚本,这些脚本或多或少是围绕awk/sed脚本的包装器。参见例如,我曾经提出的扩展(
sed
)示例。为什么需要df?我想不出来。
df
不是必需的,但这里给出了示例命令。用你喜欢的任何命令替换
df
,当然awk脚本也是如此。回答得好。但是您必须使用单引号,否则您的字段变量将无法正确解析:
awk-f-inputfile.txt是的---实际上在发布后大约十分钟我自己就知道了,然后忘了更新我的答案!谢谢
awkscript=$(cat << EOT
BEGIN{
    print "test"
}
{print $3}
EOT
)

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