BashスクリプトのcURLレスポンスからURLを抽出し、このURLを使用して他のcURLコマンドを実行する方法

BashスクリプトのcURLレスポンスからURLを抽出し、このURLを使用して他のcURLコマンドを実行する方法

データを出力として取得するカールコマンドの例があります。これに加えて、出力には、次のデータを取得するためにカールコマンドを実行するために再利用できる別のURLも含まれています。応答の次のURLを使用して、スクリプトがプログラムで次のページのイベントを自動的に返すbashスクリプトを作成するのに役立ちます。

例:

カール -H '権限付与: フォワーダ' -XGET 'https://.loggly.com/apiv2/events/iterate?q=*&from=-10m&until=now&size=1'

出力サンプル:

{
"events": [
   {
       "raw": "{\"function\": \"handle\", \"publish_success\": 83, \"timestamp\": \"17-02-01 00:58:04,852149\", \"start_time\": 1485910682.351175, \"args\": \"\", \"duration\": 2501, \"message\": \"end publish run\", \"publish_fail\": 0, \"level\": \"INFO\", \"source_duration\": {\"duration\": 1, \"end_time\": 1485910682.351801}, \"feature_duration\": {\"duration\": 1427, \"end_time\": 1485910683.786751}, \"pathname\": \"/opt/loggly/web/app/alert/management/commands/alerterd.py\", \"lineno\": 329, \"cache_duration\": {\"duration\": 1, \"end_time\": 1485910684.821093}, \"action\": \"alerterd\", \"update_duration\": {\"duration\": 8, \"end_time\": 1485910684.852121}, \"end_time\": 1485910684}",
       "logtypes": [
          "json",
          "syslog"
       ],
       "timestamp": 1485910684852,
       "unparsed": null,
       "logmsg": "{\"function\": \"handle\", \"publish_success\": 83, \"timestamp\": \"17-02-01 00:58:04,852149\", \"start_time\": 1485910682.351175, \"args\": \"\", \"duration\": 2501, \"message\": \"end publish run\", \"publish_fail\": 0, \"level\": \"INFO\", \"source_duration\": {\"duration\": 1, \"end_time\": 1485910682.351801}, \"feature_duration\": {\"duration\": 1427, \"end_time\": 1485910683.786751}, \"pathname\": \"/opt/loggly/web/app/alert/management/commands/alerterd.py\", \"lineno\": 329, \"cache_duration\": {\"duration\": 1, \"end_time\": 1485910684.821093}, \"action\": \"alerterd\", \"update_duration\": {\"duration\": 8, \"end_time\": 1485910684.852121}, \"end_time\": 1485910684}",
       "id": "7ce48bda-e819-11e6-808b-12a1c1f6d2c3",
       "tags": [],
       "event": {
           "syslog": {
               "severity": "Informational",
               "appName": "msg",
               "timestamp": "2017-02-01T00:58:04.852+00:00",
               "facility": "local use 1",
               "priority": "142",
               "host": "127.0.0.1"
           },
           "json": {
               "function": "handle",
               "publish_success": 83,
               "level": "INFO",
               "timestamp": "17-02-01 00:58:04,852149",
               "start_time": 1485910682.351175,
               "cache_duration": {
                   "duration": 1,
                   "end_time": 1485910684.821093
           },
           "update_duration": {
               "duration": 8,
               "end_time": 1485910684.852121
           },
           "duration": 2501,
           "pathname": "/opt/loggly/web/app/alert/management/commands/alerterd.py",
           "end_time": 1485910684,
           "source_duration": {
               "duration": 1,
               "end_time": 1485910682.351801
           },
           "action": "alerterd",
           "message": "end publish run",
           "publish_fail": 0,
           "feature_duration": {
               "duration": 1427,
               "end_time": 1485910683.786751
           },
           "lineno": 329
           }
       }
   }
],
"next": "https://<subdomain>.loggly.com/apiv2/events/iterate?next=eea25ee6-0e48-4428-a544-36d6441d132c"

}

だから私たちは次のように別のコマンドを実行したいと思います:

カール -H '権限付与: フォワーダ' -XGET 'https://.loggly.com/apiv2/events/iterate?next=eea25ee6-0e48-4428-a544-36d6441d132c'

答え1

jqコマンドを見てください。まだインストールされていない場合は、ほとんどのリポジトリで利用可能になります。コマンドラインからJSONを解析するために使用されます。マンページやここから詳細情報を読むことができます。

https://jqlang.github.io/jq

たとえば、次のようにカールコマンドの出力をjqにパイプする場合:

   curl .... | jq '.next' 

次のように引用符で囲まれたURL値のみを取得できます。

"https://<subdomain>.loggly.com/apiv2/events/iterate?next=eea25ee6-0e48-4428-a544-36d6441d132c"

値の妥当性をテストしたり、他のカールまたは必要な項目に渡すことができます。

答え2

.jsonを解析してその部分を抽出するには、jq、fx、またはjshonなどのツールを使用する必要があります.next

ジャック:シンプルで高速なJSONパーサーです。

FX:カールで使用するように設計されたJSONパーサー。

ジェイソン:本当に速くて軽いJSONパーサーです。

これにより、bashスクリプト(jqを使用)は次のように簡単になります。

#!/bin/bash
JSONF="filewithurl.json"
curl  $(jq -r ".next" < ${JSONF}) -H 'Authorization: bearer '

参考までに未テストお客様の URL が不完全なため、セキュリティやコードの漏洩によるものと推定されます。

関連情報