Запрос API конечных точек Open Stack OS X

У меня есть следующий скрипт bash для анализа конечных точек JSON:

echo curl  -s -H "X-Auth-Token: my_access_token" -X GET "https://api.selvpc.ru/identity/v3/endpoints?interface=public" | python -mjson.tool | grep -Pi '^\s*"url":\s*".*",?$' | awk '{print $2}' | tr -d '"' | sed "s/[%\\\$](tenant_id)s/my_project_id/g")

Но Баш говорит:

-bash: синтаксическая ошибка рядом с неожиданным токеном `)'

Мой хостер говорит, что этот скрипт хорошо работает на ОС на базе Linux, но не гарантирует работу на OS X. В чем может быть проблема с синтаксисом?

ИЗМЕНИТЬ:

Если я использую следующее:

curl  -s -H "X-Auth-Token: my_access_token" -X GET "https://api.selvpc.ru/identity/v3/endpoints?interface=public" | python -mjson.tool

JSON анализируется, как и ожидалось. Но с grep -Pi '^\s*"url":\s*".*",?$' я думаю, это вызывает grep предупреждение

использование: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A число] [-B число] [-C[число]] [-e шаблон] [-f файл] [--binary-files=значение] [--color=когда] [--context[=num]] [--directories=action] [--label] [--line-buffered] [--null] [шаблон] [файл ...]

Я предполагаю, что первая проблема - ошибка grep?


person Nikita Semenov    schedule 24.11.2015    source источник
comment
Ну, в конце этого пайплайна явно стоит ). Пометка о закрытии, так как это типографская ошибка.   -  person 4ae1e1    schedule 24.11.2015
comment
@4ae1e1 ага, понял. Теперь это : использование: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A число] [-B число] [-C[число]] [-e шаблон] [-f файл] [--binary-files=значение] [--color =when] [--context[=num]] [--directories=action] [--label] [--line-buffered] [--null] [шаблон] [файл ...] Объект JSON не может быть расшифрован   -  person Nikita Semenov    schedule 24.11.2015
comment
Хорошо. Во-первых, если вы хотите запустить curl, то почему вы пишете echo впереди? Удалите это echo. Во-вторых, из вашего grep синопсиса следует, что ваш grep не поддерживает -P; вы случайно не на OS X? (Ах, да, теперь я вижу предложение об OS X.) В этом случае вам нужно немного изменить регулярное выражение (на самом деле достаточно экранирования ?): grep -i '^\s*"url":\s*".*",\?$'.   -  person 4ae1e1    schedule 24.11.2015
comment
А если серьезно, парсить JSON с grep и awk, tr, sed и т. д. — это плохо. Получите выделенный процессор JSON, например, jq.   -  person 4ae1e1    schedule 24.11.2015
comment
ага, @4ae1e1, убегаешь? помогло и удаление -P) Большое спасибо   -  person Nikita Semenov    schedule 24.11.2015
comment
Что ж, побег — это неправильное слово здесь... В любом случае я имею в виду замену ? на \?, потому что здесь мы имеем дело с BRE, где ? — буквальный вопросительный знак, а \? — магический метасимвол.   -  person 4ae1e1    schedule 24.11.2015


Ответы (2)


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

wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-osx-amd64
mv jq-osx-amd64 jq
chmod u+x jq

curl -s -H "X-Auth-Token: $TOKEN" https://api.selvpc.ru/identity/v3/endpoints?interface=public | \
  ./jq -r .endpoints[].url

Это даст вам список конечных точек OpenStack API.

person Everett Toews    schedule 24.11.2015

Я думаю, что скрипт Python, использующий python-keystoneclient, может быть проще для понимания и обслуживания.

person ZhiQiang Fan    schedule 25.11.2015