gpt4 book ai didi

linux - 使用 awk 生成 bash 命令,给出失控的字符串常量 - awk

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:31 25 4
gpt4 key购买 nike

我正在使用 awk 来解析 /etc/hosts 并生成一个命令,它将为我格式化 MapR。它是在 Chef 中的 bash 实用程序中完成的:

egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \
| awk 'NR==1{ips=$1}
NR>1{ips=ips ", " $1}
$2=="namenode"{nn=$1}
END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb\n", ips, nn}' \
| bash
sleep 60

上面的命令应该执行以下命令:

/opt/mapr/server/configure.sh -C 10.32.237.251 -Z 10.32.237.251 -N mycluster --create-user -D /dev/xvdb

但是,查看我的 chef 输出我看到:

==> namenode: Executing awk utility
==> namenode: awk: line 1: runaway string constant "/opt/mapr/ ...

该命令从未在 MapR 节点中执行...但是,当我直接在终端上执行它时,它以预期的方式很好地工作。我究竟做错了什么?我正在更新问题以显示执行该实用程序的完整 bash 脚本:

DISK_CONFIG=/home/ubuntu/disk_config
if [ -f $DISK_CONFIG ];
then
echo "File already exists"
else
echo "Executing awk utility\n"
touch $DISK_CONFIG
egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \
| awk 'NR==1{ips=$1}
NR>1{ips=ips ", " $1}
$2=="namenode"{nn=$1}
END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb\n", ips, nn}' \
| bash
sleep 60
fi

最佳答案

假设您在 bash 资源中使用 HEREDOC 语法:

bash "whatever" do
code <<-EOH
DISK_CONFIG=/tmp/disk_config
if [ -f $DISK_CONFIG ];
then
echo "File already exists"
else
echo "Executing awk utility\n"
touch $DISK_CONFIG
egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \
| awk 'NR==1{ips=$1}
NR>1{ips=ips ", " $1}
$2=="namenode"{nn=$1}
END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb\n", ips, nn}' \
| bash
fi
EOH
end

这个导致你的错误:

Executing awk utility

awk: line 4: runaway string constant "/opt/mapr/ ...

这是由于您的命令中的\n(awk 命令中的那个也可能有问题)

这个资源应该可以(警告我确实为我的测试替换了 DISK_CONFIG 路径):

bash "whatever" do
code <<-EOH
DISK_CONFIG=/tmp/disk_config
if [ -f $DISK_CONFIG ];
then
echo "File already exists"
else
echo "Executing awk utility"
touch $DISK_CONFIG
egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \
| awk 'NR==1{ips=$1}
NR>1{ips=ips ", " $1}
$2=="namenode"{nn=$1}
END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb", ips, nn}' \
| bash
sleep 60
fi
EOH
end

原因是 Chef 已经解释了代码中的 \n,所以 awk 看到了一个永无止境的字符串(失控)。

当您通过管道传输到 bash 时,您可以省略 \n,因为管道将结束该行。

关于linux - 使用 awk 生成 bash 命令,给出失控的字符串常量 - awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29361131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com