根据第二列中的值,我需要对这些值运行另一个命令。
[root@box ~]# for i in $(openstack server list --all -c ID -f value); do openstack server show $i -f value -c name -c project_id | xargs printf '%-60s %sn'; done
cf1-0 ebf0f23f424c4417afd3e7bbf4e3900f
sf1-3 ebf0f23f424c4417afd3e7bbf4e3900f
sf1-2 ebf0f23f424c4417afd3e7bbf4e3900f
sf1-0 ebf0f23f424c4417afd3e7bbf4e3900f
下面是我想做的一个例子。
[root@box ~]# for i in $(openstack server list --all -c ID -f value); do openstack server show $i -f value -c name -c project_id | xargs printf "%-60s eval(openstack project show %s -f value -c name)"; done
cf1-0 eval(openstack project show ebf0f23f424c4417afd3e7bbf4e3900f -f value -c name)
printf中第二个%s的替换工作正常,但我不知道如何执行该命令。
该命令需要在同一个shell中执行,并且我不能使用环境变量。
谢谢。
**命令输出**
这里,-c var1-c var2可以按任何顺序放置-f只是表示打印出值,而不是标识符。
[root@box~]# openstack server list --all -c Name -c ID -f value
2534ce5a-04da-4c7d-9ad5-b7bc466ae612 cf1-0
[root@box ~]# openstack server show 2534ce5a-04da-4c7d-9ad5-b7bc466ae612 -f value -c name -c project_id
cf1-0
ebf0f23f424c4417afd3e7bbf4e3900f
[root@box ~]# openstack project show ebf0f23f424c4417afd3e7bbf4e3900f -f value -c name
core
Desired output
===============
cf1-0 core
不要通过添加更多级别的xargs
来使事情变得更加复杂。建议使用while
循环读取每个阶段的输出并对其进行进一步处理。以下工作在bash
和<(..)
过程替代中
#!/usr/bin/env bash
while read -r id instname; do
proj="$(openstack server show "$id" -f value -c project_id)"
[ -z "$proj" ] && break
name="$(openstack project show "$proj" -f value -c name)"
printf '%s %sn' "$instname" "$name"
done < <(openstack server list --all -c ID -c Name -f value)
不太熟悉openstack命令,但在一行中执行此操作的简单方法是使用awk
和system
函数。
命令应该类似于以下内容:
openstack server list --all -c ID -f value | awk -F't' '{ printf $1; system("eval openstack project show " $2 " -f value -c name") }'