#json #shell #curl #token
#json #оболочка #curl #токен
Вопрос:
Я пишу этот скрипт
#!/bin/bash
# cm.sh
curl -i
-H "Content-Type: application/json"
-d '
{ "auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "admin",
"domain": { "id": "default" },
"password": "secret"
}
}
}
}
}'
"http://localhost/identity/v3/auth/tokens" ; echo
echo $tokenizer1
echo $tokenizer2
Но все они (awk или sed) одинаковы
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 540 100 312 100 228 312 228 0:00:01 --:--:-- 0:00:01 5142
Моя цель — поместить токен в переменную на потом.
Заранее спасибо, ребята.
Комментарии:
1. Я снова открыл это, потому что речь идет не о разборе JSON, а о HTTP-заголовках
Ответ №1:
Вместо того, чтобы использовать прямой результат cURL, вы могли бы сохранить результат в файле и использовать для него свою команду grep. Возможно, что-то вроде этого :
curl -o boulou.txt http://localhost/identity/v3/auth/tokens amp;amp; cat boulou.txt | grep "X-Subject-Token" | awk '{printf $2}'
Редактировать, если вы просто хотите получить желаемый результат, добавьте --silent
в команду cURL :
curl -o boulou.txt http://localhost/identity/v3/auth/tokens --silent amp;amp; cat boulou.txt | grep "X-Subject-Token" | awk '{printf $2}'
Правка 2: Если вы хотите экспортировать его и удалить свой файл, вы могли бы использовать что-то вроде этого :
export OS_TOKEN=$(curl -o billy.txt hhttp://localhost/identity/v3/auth/tokens --silent amp;amp; cat billy.txt | grep "X-Subject-Token" | awk '{printf $2}') amp;amp; rm billy.txt
Комментарии:
1. Я обновил свой ответ @Khalfe, скажите мне, если вам нужно еще что-то
Ответ №2:
«Как мне использовать grep / awk для извлечения заголовка в поле из curl, когда я передаю ему документ JSON, когда содержимое хранится в переменной?» — это действительно очень сложная и уникальная проблема.
Однако, если вы постепенно обработаете каждую часть своего кода, чтобы сузить круг поиска, вы обнаружите, что это гораздо более простой вопрос, который вы могли бы исследовать или задать вместо этого:
Как мне использовать grep / awk для содержимого переменной?
У меня есть переменная, содержащая HTTP-заголовки, и я хочу извлечь значение одного из них. Вот пример:
variable='Foo: 1 Bar: 2 Baz: 3'
Это то, что я пытался получить
2
отBar
:# Just hangs tokenizer1=$variable `grep "Bar" | awk '{printf $2}'` # Is empty tokenizer2=$variable | `grep "Bar" | awk '{printf $2}'`
Ответ здесь заключается в том, чтобы использовать echo
для передачи содержимого, чтобы grep мог прочитать его в stdin:
tokenizer3=$(echo "$variable" | grep "Bar" | awk '{printf $2}')
Это легко применить к вашему примеру:
tokenizer3=$(echo "$token" | grep "X-Subject-Token" | awk '{printf $2}')
echo "The value is $tokenizer3"
Комментарии:
1.
awk '/Bar/ { print $2 }'
— нет необходимости в предварительномgrep
.