使用awk将变量替换为ls命令的结果

时间:2017-11-23 07:40:58

标签: linux bash awk

我正在尝试显示每个主机中部署的应用程序。使用bash脚本我取得了一些成功,除了我想用$ {i}变量下存储的实际主机名替换下面的“hostname”部分。我不能只替换它,因为我不能把一个花括号放在另一个里面。即使我能做到,我仍然遇到麻烦,因为$ {i}将被ls的结果取代。我该如何解决这个问题?

hosts=(usa1 london2)
for i in ${hosts[@]}; do
    echo ---${i}---
    ssh ttoleung@${i} ls /apps | awk '{ printf("%s:%s\n", "hostname", $0) }'
done

当前输出,基于上面的代码片段:

---usa01---
hostname:E2.gui
hostname:E1.server
---london2---
hostname:E1.gui

期望的输出:

---usa01---
usa01:E2.gui
usa01:E1.server
---london2---
london2:E1.gui

2 个答案:

答案 0 :(得分:1)

作为一个介绍说明,它不是一个没有双引号的安全扩展数组名称,除非出于显而易见的原因,因为这样做会将数组中的引用字符串拆分为自己有空格

所以改变

for i in ${hosts[@]}; 

for i in "${hosts[@]}";  # Note the quoted array

现在,遇到问题,您可以使用其-v参数将bash变量传递给awk。所以改变

ssh ttoleung@${i} ls /apps | awk '{ printf("%s:%s\n", "hostname", $0) }'

ssh ttoleung@${i} ls /apps | awk -v hname="${i}" '{ printf("%s:%s\n", hname, $0) }'

这里我们将shell参数${i}传递给awk变量hname

旁注:由于[ here ]提到的原因,请不要解析ls输出。但在你的情况下,它并没有太大的区别。

答案 1 :(得分:1)

替换:

awk '{ printf("%s:%s\n", "hostname", $0) }'

使用:

awk -v h="$i" '{ printf("%s:%s\n", h, $0) }'

-v h="$i"告诉awk创建一个awk变量h并为其赋值shell变量$i的值。

除此之外:我们使用h="$i"而不是h=$i,因为将shell变量放在双引号中是个好习惯,除非您希望shell执行分词路径名扩展