使用一个命令的输出并用作下一个命令的输入来运行命令

时间:2020-02-19 16:32:48

标签: bash

基于第二列中的值,我需要对这些值运行另一个命令。

[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 %s\n'; 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

2 个答案:

答案 0 :(得分:2)

不要通过添加更多级别的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 %s\n' "$instname" "$name"
done < <(openstack server list --all -c ID -c Name -f value)

答案 1 :(得分:0)

对openstack命令不是很熟悉,但是在同一行中执行此操作的一种简单方法是将awksystem函数一起使用。

命令应类似于以下内容:

openstack server list --all -c ID -f value | awk -F'\t' '{ printf $1; system("eval openstack project show " $2 " -f value -c name") }'