【问题标题】:how to find the string and it value using grep or awk [duplicate]如何使用 grep 或 awk 查找字符串及其值 [重复]
【发布时间】:2019-03-23 03:13:58
【问题描述】:

我是 shell 脚本的新手,并开始使用它。

我最近编写了 shell 脚本来调用 rest API,我能够毫无问题地执行它。

我已将输出存储在如下变量中

{
  "id": 3184136,
  "name": "XXX TEST API",
  "url": "http://xxxxxxxxxxx/_apis/test/Runs/3184136",
  "isAutomated": true,
  "owner": {
    "displayName": "XXXX",
    "url": "http://xxxxxxxxxxx/_apis/Identities/dbf722a9-73b0-46d6-a2bd-9835c1f0c221",
    "_links": {
      "avatar": {
        "href": "http://xxxxxxxxxxx/_api/_common/identityImage?id=dbf722a9-73b0-46d6-a2bd-9835c1f0c221"
      }
    },
    "id": "dbf722a9-73b0-46d6-a2bd-9835c1f0c221",
    "uniqueName": "xxxxxxxxxxx\\ServiceLaunchpadDev",
    "imageUrl": "http://xxxxxxxxxxx/_api/_common/identityImage?id=dbf722a9-73b0-46d6-a2bd-9835c1f0c221"
  },
  "project": {
    "id": "6d5e21e7-c75e-464a-9708-90fbff086902",
    "name": "eDellPrograms"
  },
  "startedDate": "2018-10-11T06:36:50.627Z",
  "completedDate": "2018-10-11T07:04:45.153Z",
  "state": "Completed",
  "plan": {
    "id": "5299555",
    "name": "Smoke Dashboard Peso - DIT",
    "url": "http://xxxxxxxxxxx/_apis/test/Plans/5299555"
  },
  "postProcessState": "Complete",
  "totalTests": 5,
  "incompleteTests": 0,
  "notApplicableTests": 0,
  "passedTests": 0,
  "unanalyzedTests": 5,
  "createdDate": "2018-10-11T06:36:50.533Z",
  "lastUpdatedDate": "2018-10-11T07:04:45.153Z",
  "lastUpdatedBy": {
    "displayName": "xxxxxxxxxxx",
    "url": "http://xxxxxxxxxxx/_apis/Identities/8de2a654-063b-48bd-8101-87e4ec2f05e3",
    "_links": {
      "avatar": {
        "href": "http://xxxxxxxxxxx/_api/_common/identityImage?id=8de2a654-063b-48bd-8101-87e4ec2f05e3"
      }
    },
    "id": "8de2a654-063b-48bd-8101-87e4ec2f05e3",
    "uniqueName": "xxxxxxxxxxx\\xxxxxxxxxxx",
    "imageUrl": "http://xxxxxxxxxxx/_api/_common/identityImage?id=8de2a654-063b-48bd-8101-87e4ec2f05e3"
  },
  "controller": "xxxxxxxxxxx",
  "revision": 5,
  "comment": "Build Definition : xxxxxxxxxxx \nBuild Version : xxxxxxxxxxx_20180925.1\nConfiguration : DIT\nBatch type : Suite\nTest type : Parallel\nTest Controller Name : xxxxxxxxxxx\nPreferred Agents : ADPTAW10A618|ADPTAW10A619|ADPTAW10A621 \nRequested by : xxxxxxxxxxx\nEmail Request : Y\nEmail To : xxxxxxxxxxx\nEmailCc : xxxxxxxxxxx\nEnvironment : DIT\nTest Setting : DIT\nContinue On Failure : false\nDNS Setting : false",
  "dropLocation": "\\\\xxxxxxxxxxx\\DropFolder\\xxxxxxxxxxx_20180925.1",
  "runStatistics": [
    {
      "state": "Completed",
      "outcome": "Failed",
      "count": 5
    }
  ],
  "webAccessUrl": "http://xxxxxxxxxxx/_TestManagement/Runs#runId=3184136&_a=runCharts"
}

从上面的输出中,我试图找到“状态”及其值。但我无法做到这一点。请任何人帮助我。

echo $result | grep -o 'state*'

使用上面的命令,我可以打印状态。但我期待状态和它的价值。

感谢您的帮助。提前致谢。

【问题讨论】:

  • echo $result | jq '.state'
  • @kvantour 你应该引用"$result",而且可能一开始就不要将此字符串存储在变量中。
  • echo "$result" | jq '.state'
  • @ Kvantour ,我不确定这个问题为什么与上述链接重复?它与上述完全不同。请更改它的状态

标签: linux bash shell


【解决方案1】:

我尝试将您的 json 存储在一个名为 n2.json 的文件中。

cat n2.json
{  
   "id":3184136,
   "name":"XXX TEST API",
   "url":"http://xxxxxxxxxxx/_apis/test/Runs/3184136",
   "isAutomated":true,
   "owner":{  
      "displayName":"XXXX",
      "url":"http://xxxxxxxxxxx/_apis/Identities/dbf722a9-73b0-46d6-a2bd-9835c1f0c221",
      "_links":{  
         "avatar":{  
            "href":"http://xxxxxxxxxxx/_api/_common/identityImage?id=dbf722a9-73b0-46d6-a2bd-9835c1f0c221"
         }
      },
      "id":"dbf722a9-73b0-46d6-a2bd-9835c1f0c221",
      "uniqueName":"xxxxxxxxxxx\\ServiceLaunchpadDev",
      "imageUrl":"http://xxxxxxxxxxx/_api/_common/identityImage?id=dbf722a9-73b0-46d6-a2bd-9835c1f0c221"
   },
   "project":{  
      "id":"6d5e21e7-c75e-464a-9708-90fbff086902",
      "name":"eDellPrograms"
   },
   "startedDate":"2018-10-11T06:36:50.627Z",
   "completedDate":"2018-10-11T07:04:45.153Z",
   "state":"Completed",
   "plan":{  
      "id":"5299555",
      "name":"Smoke Dashboard Peso - DIT",
      "url":"http://xxxxxxxxxxx/_apis/test/Plans/5299555"
   },
   "postProcessState":"Complete",
   "totalTests":5,
   "incompleteTests":0,
   "notApplicableTests":0,
   "passedTests":0,
   "unanalyzedTests":5,
   "createdDate":"2018-10-11T06:36:50.533Z",
   "lastUpdatedDate":"2018-10-11T07:04:45.153Z",
   "lastUpdatedBy":{  
      "displayName":"xxxxxxxxxxx",
      "url":"http://xxxxxxxxxxx/_apis/Identities/8de2a654-063b-48bd-8101-87e4ec2f05e3",
      "_links":{  
         "avatar":{  
            "href":"http://xxxxxxxxxxx/_api/_common/identityImage?id=8de2a654-063b-48bd-8101-87e4ec2f05e3"
         }
      },
      "id":"8de2a654-063b-48bd-8101-87e4ec2f05e3",
      "uniqueName":"xxxxxxxxxxx\\xxxxxxxxxxx",
      "imageUrl":"http://xxxxxxxxxxx/_api/_common/identityImage?id=8de2a654-063b-48bd-8101-87e4ec2f05e3"
   },
   "controller":"xxxxxxxxxxx",
   "revision":5,
   "comment":"Build Definition : xxxxxxxxxxx \nBuild Version : xxxxxxxxxxx_20180925.1\nConfiguration : DIT\nBatch type : Suite\nTest type : Parallel\nTest Controller Name : xxxxxxxxxxx\nPreferred Agents : ADPTAW10A618|ADPTAW10A619|ADPTAW10A621 \nRequested by : xxxxxxxxxxx\nEmail Request : Y\nEmail To : xxxxxxxxxxx\nEmailCc : xxxxxxxxxxx\nEnvironment : DIT\nTest Setting : DIT\nContinue On Failure : false\nDNS Setting : false",
   "dropLocation":"\\\\xxxxxxxxxxx\\DropFolder\\xxxxxxxxxxx_20180925.1",
   "runStatistics":[  
      {  
         "state":"Completed",
         "outcome":"Failed",
         "count":5
      }
   ],
   "webAccessUrl":"http://xxxxxxxxxxx/_TestManagement/Runs#runId=3184136&_a=runCharts"
}

然后在此之上使用jq

jq -r '.state' n2.json 
Completed

【讨论】:

  • 是的,jq 是在 bash 中处理 JSON 对象的一种更简洁的方式。
  • @SivaSankaraRaoBacha 我使用了文件,因为在这里粘贴它比粘贴变量要干净得多。否则答案很简单,echo $var | jq -r '.state' 这只是为了您的理解。
【解决方案2】:

您正在寻找 'state'、'statee'、'stateee'、'stateeee' 等。

通配符适用于前面的字符。

试试这个:

echo $result | grep -o '"state":[^,]*'

它查找直到下一个逗号的所有内容,但不包括下一个逗号。

【讨论】:

  • Jack,如果你不介意的话,你能不能帮我单独获取第一个匹配的字符串值(状态),因为我已经在文件的多个位置声明了。
  • 当然。只需添加` |上面命令末尾的 head -1`。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 2023-03-29
  • 2012-04-17
  • 2012-11-21
  • 2010-12-07
相关资源
最近更新 更多