Home > database >  JQ- print specific key value pair
JQ- print specific key value pair

Time:03-02

I have this JSON:

{
    "time": "2022-02-28T22:00:55.196Z",
    "severity": "INFO",
    "params": [
        {"key": "state", "value": "pending"},
        {"key": "options", "value": "request"},
        {"key": "description", "value": "[FILTERED]"}
    ],
    "content_length": "231"
}

I want to print key value pairs of where the key matches to state and options and also the time and its value. I am able to print the time and all key value pairs by using below command, but not sure how to extract specific key value pairs.

jq '"time:\(.time)" ,[.params[] | "key:\(.key)" ,"value:\(.value)"]' test.json

This gives the output:

"time:2022-02-28T22:00:55.196Z"
[
  "key:state",
  "value:pending",
  "key:options",
  "value:request",
  "key:description",
  "value:[FILTERED]"
]

But my desired output is:

"time:2022-02-28T22:00:55.196Z"
  "key:state",
  "value:pending",
  "key:options",
  "value:request"

CodePudding user response:

One solution to the stated problem would be:

< test.json jq ' 
  "time:\(.time)",
  [.params[] | select(.key|IN("state","options"))
   | "key:\(.key)" ,"value:\(.value)"]
' | sed '/^[][]$/d'

However, it would almost certainly be better to modify the requirements slightly so that the output format is less idiosyncratic. This should also make it easier to formulate a cleaner (e.g. only-jq) solution.

  • Related