子要素の値に基づいてjson配列要素を抽出する

子要素の値に基づいてjson配列要素を抽出する

次のサンプルファイルがあります(非常に長いファイル、ここに短いサンプルがあります)。

"request_status" : "FAILED"
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/333",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 333,
        "request_status" : "COMPLETED"
    }
},
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/334",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 334,
        "request_status" : "FAILED"
    }
},
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/335",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 335,
        "request_status" : "FAILED"
    }
},
{
    "href" : "http://localhost:8080/api/v1/clusters/sys41/requests/336",
    "Requests" : {
        "cluster_name" : "sys41",
        "id" : 336,
        "request_status" : "COMPLETED"
    }
}

一致する行の後に行を印刷する方法、"id" : $num
例:

num=335 

次の行を取得する方法

"id" : $num

期待される出力

"request_status" : "FAILED"

答え1

JSONファイルが次のような大規模なオブジェクト配列であるとします。

  {
    "href": "http://localhost:8080/api/v1/clusters/sys41/requests/333",
    "Requests": { "id": 333, "cluster_name": "sys41", "request_status": "COMPLETED" }
  },

(改行は重要ではなく、オブジェクトのキー順序も重要ではありません。)その後、次のコマンドは次のものを取得しますjqrequest_statusid$num

$ num=355
$ jq -r ".[].Requests | select(.id == $num).request_status" file.json
FAILED

これはRequests、各オブジェクトからすべての項目を選択することによって行われますid。フィルタを通過した項目についてrequest_status

-rjqJSONの代わりに生データを出力するオプションです(FAILEDこのオプションがない場合は二重引用符で囲みます)。


報酬データ:

$ jq -r '.[].Requests | "\(.id): \(.request_status)"' file.json
333: COMPLETED
334: FAILED
335: FAILED
336: COMPLETED

答え2

シェル変数のnum設定が次のとおりです335

grep -A1 "\"id\" : $num," /path/to/file

grepHandy -A, Options で-B多くの助けを受け-C、私が使ったニーモニックは「After」、「Before」、「Context」でした。

  • grep -A n 'pattern' file表示されますNワイヤーパターンマッチング後、ライン自体マッチングに加えます。

  • grep -C n 'pattern' file表示されますNワイヤー第二パターンマッチング前、ライン自体マッチングに加え。

  • grep -C n 'pattern' file表示されますN前の2行そして以降(つまりコンテキスト)パターンマッチング、ライン自体マッチングに加えて。

答え3

awk '/"id" : 335/{getline;print}'

または

var="\"id\" : 335"
awk "/$var/{getline;print}"

または

awk -v var="\"id\" : 335" '$0~var{getline;print}'

または

var="\"id\" : 335"
awk -v var="$var" '$0~var{getline;print}'

あるいは、上記の項目の1つですが、"id" : "文字列の一部は必要ありません。形式は次のとおりです。

awk -v var="335" '$0~"id" : var{getline;print}'

関連情報