извлеките JSON из ответа curl с помощью Sed или awk и присвоите переменной для последующего использования

#linux #unix #curl #awk #sed

#linux #unix #curl #awk #sed

Вопрос:

Я пишу скрипт bash для запуска на устройстве Linux, поэтому у меня нет доступа к установке jq, мне нужно иметь возможность использовать собственные инструменты Linux

 curl --location --request POST "https://api-mp.meraki.com/api/v1/networks/12345/switch/stacks/12345/routing/interfaces" 
  --header "X-Cisco-Meraki-API-Key: 123key" 
  --header "Content-Type: application/json" 
  --data '{
    "name": "L3 int",
    "subnet": "192.168.249.0/24",
    "interfaceIp": "192.168.249.2",
    "multicastRouting": "disabled",
    "vlanId": 140,
    "ospfSettings": {
        "area": "0",
        "cost": 1,
        "isPassiveEnabled": true
    }
}'  | sed -n 's|.*"interfaceID":"([^"]*)".*|1|p' > $newVar
  

ответ от сервера возвращает это:

 {
"interfaceId": "12345",
"name": "PA L3 DR Int",
"subnet": "192.168.249.0/24",
"interfaceIp": "192.168.249.2",
"multicastRouting": "disabled",
"vlanId": 140,
"ospfSettings": {
    "area": "0",
    "cost": 1,
    "isPassiveEnabled": true
}
}
  

Затем мне нужно иметь возможность доступа к новой переменной InterfaceID в параметре строки запроса

Ответ №1:

Вы просто неправильно указали регистр ( ID vs Id в interfaceId ) и забыли о пробеле после : , но вы были близки к этому:

 $ sed -n 's|.*"interfaceId": *"([^"]*)".*|1|p' file
12345
  

Используйте cat file вместо вашей curl команды, чтобы показать, как сохранить это в переменной на случай, если вы не знаете:

 $ var=$(cat file | sed -n 's|.*"interfaceId": *"([^"]*)".*|1|p')
$ echo "$var"
12345
  

Ответ №2:

Не могли бы вы, пожалуйста, попробовать следующее. Успешно протестировано по ссылке https://ideone.com/EsdCQp

 your_command | 
awk '
/"interfaceId": "/{
  gsub(/[^0-9] |",/,"")
  print
}
'