Запускайте команды, используя выходные данные одной команды и используя их в качестве входных данных для следующей - PullRequest
0 голосов
/ 19 февраля 2020

Исходя из значений во втором столбце, мне нужно выполнить другую команду для этих значений.

[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)

Подстановка из второго% s в printf работает правильно, но я не могу понять, как выполнить команду.

Команда должна быть выполнена в той же оболочке, и я не могу использовать переменные окружения.

Спасибо.

** ВЫХОД КОМАНД **

Здесь, - 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 ]

2 голосов
/ 19 февраля 2020

Не делайте вещи более запутанными, добавляя дополнительные уровни xargs. Рекомендуем использовать while l oop для чтения выходных данных на каждом этапе и дальнейшей их обработки. Нижеследующее работает в 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)
0 голосов
/ 19 февраля 2020

Не очень знаком с командой 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") }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...