jsonnewlinejq

JQ how to print newline and not newline character from json value


I have some logs that output information in JSON. This is for collection to elasticsearch.

Some testers and operations people want to be able to read logs on the servers.

Here is some example JSON:

{
"@timestamp": "2015-09-22T10:54:35.449+02:00",
"@version": 1,
"HOSTNAME": "server1.example",
"level": "WARN",
"level_value": 30000,
"logger_name": "server1.example.adapter",
"message": "message"
"stack_trace": "ERROR LALALLA\nERROR INFO NANANAN\nSOME MORE ERROR INFO\nBABABABABABBA BABABABA ABABBABAA BABABABAB\n"
}

And so on.

Is it possible to make Jq print newline instead of the \n character sequence as seen in the value of .stack_trace?


Solution

  • The input as originally given isn't quite valid JSON, and it's not clear precisely what the desired output is, but the following might be of interest. It is written for the current version of jq (version 1.5) but could easily be adapted for jq 1.4:

    def json2qjson:
      def pp: if type == "string" then "\"\(.)\""  else . end;
      . as $in
      | foreach keys[] as $k (null; null; "\"\($k)\": \($in[$k] | pp)" ) ;
    
    
    def data: {
      "@timestamp": "2015-09-22T10:54:35.449+02:00",
      "@version": 1,
      "HOSTNAME": "server1.example",
      "level": "WARN",
      "level_value": 30000,
      "logger_name": "server1.example.adapter",
      "message": "message",
      "stack_trace": "ERROR LALALLA\nERROR INFO NANANAN\nSOME MORE ERROR INFO\nBABABABABABBA BABABABA ABABBABAA BABABABAB\n"
    };
    
    data | json2qjson
    

    Output:

    $ jq -rnf json2qjson.jq
    "@timestamp": "2015-09-22T10:54:35.449+02:00"
    "@version": 1
    "HOSTNAME": "server1.example"
    "level": "WARN"
    "level_value": 30000
    "logger_name": "server1.example.adapter"
    "message": "message"
    "stack_trace": "ERROR LALALLA
    ERROR INFO NANANAN
    SOME MORE ERROR INFO
    BABABABABABBA BABABABA ABABBABAA BABABABAB
    "