首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >json解析提取子字符串

json解析提取子字符串
EN

Stack Overflow用户
提问于 2019-03-08 06:19:03
回答 2查看 196关注 0票数 -1

我正在尝试从cloud foundry env json字符串中提取凭据客户端机密。

代码语言:javascript
复制
cf env myapp

给出了如下内容(不是一个合适的json,所以这就是我不能使用jq的原因)

代码语言:javascript
复制
Getting env variables for app icm in org myorg / space myspace as 
xxyy...
OK


{
  "myenv_env_json": {
"http_proxy": "http://mycompany-svr-proxy-qa.mycompany.com:7070",
"https_proxy": "http://mycompany-svr-proxy-qa.mycompany.com:7070",
"no_proxy": "*.mycompany.com"
  },
  "running_env_json": {},
  "system_env_json": {
"VCAP_SERVICES": {
  "user-provided": [
    {
      "name": "myapp-parameters",
      "instance_name": "myapp-parameters",
      "binding_name": null,
      "credentials": {
        "auth-domain": "https://sso.login.run-np.mycompany.com",
        "backend-url-other": "https://myservice-other.apps-np.mycompany.com",
        "client-secret": "121322332-32322-23232-232-32-23232",
        "stage": "mystg",
        "backend-url": "https://myservice-other.apps-np.mycompany.com",
        "client-secret-other": "121322332-32322-23232-232-32-23232"
      },
      "syslog_drain_url": "",
      "volume_mounts": [],
      "label": "user-provided",
      "tags": []
    },
    {
      "name": "appdynamics",
      "instance_name": "appdynamics",
      "binding_name": null,
      "credentials": {
        "account-access-key": "1213232-232-322-2322323-2323232-311",
        "account-name": "customer1",
        "application-name": "myenv-dev",
        "host-name": "appdx-qa.mycompany.com",
        "node-name": "$(ruby -e \"require 'json'; a = JSON.parse(ENV['VCAP_APPLICATION']); puts \\\"#{a['application_name']}-#{a['cf_api'].split(/\\.|-/)[2]}:#{a['instance_index']}\\\"\")",
        "port": "9401",
        "ssl-enabled": "true",
        "tier-name": "$(ruby -e \"require 'json'; a = JSON.parse(ENV['VCAP_APPLICATION']); puts \\\"#{a['application_name']}-#{a['cf_api'].split(/\\.|-/)[2]}\\\"\")",
        "version": "4.2.7_1"
      },
      "syslog_drain_url": "",
      "volume_mounts": [],
      "label": "user-provided",
      "tags": []
    }
  ],
  "p-identity": [
    {
      "name": "sso",
      "instance_name": "sso",
      "binding_name": null,
      "credentials": {
        "auth_domain": "https://sso.login.run-np.mycompany.com",
        "client_secret": "123232-23232-2323243-242323r3r",
        "client_id": "afdvdf-dvdfdd-fgdgdf-d23232"
      },
      "syslog_drain_url": null,
      "volume_mounts": [],
      "label": "p-identity",
      "provider": null,
      "plan": "sso",
      "tags": []
    }
  ]
}
 },
 "application_env_json": {
 "VCAP_APPLICATION": {
  "cf_api": "https://api.run-np.mycompany.com",
  "limits": {
    "fds": 16384
  },
  "application_name": "myapp",
  "application_uris": [
    "myapp-dev.apps-np.mycompany.com"
  ],
  "name": "myapp",
  "space_name": "myapp-dev",
  "space_id": "392929-23223-2323-2322-2322",
  "uris": [
    "myapp-dev.apps-np.mycompany.com"
  ],
  "users": null,
  "application_id": "fwew78cc-wewc5c-dfd8a7-89d5-fdfefwewb"
}
 }
 }

 User-Provided:
 APP_ENV: development
 GRANT_TYPE: authorization_code
 SSO_AUTO_APPROVED_SCOPES: openid
 SSO_IDENTITY_PROVIDERS: mycompany-single-signon
 SSO_LAUNCH_URL: https://myapp-dev.apps-np.mycompany.com/
 SSO_REDIRECT_URIS: https://myapp-dev.apps-np.mycompany.com/callback,http://myapp-dev.apps-np.mycompany.com/callback
 SSO_SCOPES: openid,user_attributes
 callback_url: https://myapp-dev.apps-np.mycompany.com/callback
 client_secret: secret
 client_secret_other: secretother

 No running env variables have been set

 Staging Environment Variable Groups:
 http_proxy: http://myapp-svr-proxy-qa.mycompany.com:7070
 https_proxy: http://myapp-svr-proxy-qa.mycompany.com:7070
 no_proxy: *.mycompany.com

下面是我正在尝试使用的,到目前为止还没有成功提取p-identity sub json,我的sed中出了什么问题?

代码语言:javascript
复制
 cf env myapp|sed 's/.*\(p-identity[^}].*}\).*/\1/p'

我的预期输出应该如下所示

代码语言:javascript
复制
"p-identity": [
    {
      "name": "sso",
      "instance_name": "sso",
      "binding_name": null,
      "credentials": {
        "auth_domain": "https://sso.login.run-np.mycompany.com",
        "client_secret": "123232-23232-2323243-242323r3r",
        "client_id": "afdvdf-dvdfdd-fgdgdf-d23232"
      }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-08 15:54:09

我发现了一个肮脏的变通方法,可能效率不高,但目前有效。

代码语言:javascript
复制
cf env myapp|sed 1,4d|sed -n '/User-Provided:/q;p'|jq -c -r '.VCAP_SERVICES."p-identity"[0].credentials.client_secret'| head -n1
票数 1
EN

Stack Overflow用户

发布于 2019-03-08 07:16:21

对于您的情况,通过管道将输出传递到grep以提取JSON,然后使用jq提取所需的字段可能会更容易,例如:

代码语言:javascript
复制
cf env myapp | grep -oz '{.*}' | jq 'your filter here'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55053707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档