JQ如何从json值打印换行符而不是换行符

时间:2015-09-22 10:53:07

标签: json newline jq

我有一些用JSON输出信息的日志。这是为了收集到elasticsearch。

一些测试人员和操作人员希望能够读取服务器上的日志。

以下是JSON的一些示例:

{{1}}

等等。

是否可以使Jq打印换行而不是\ n char?

3 个答案:

答案 0 :(得分:29)

当然!使用-r选项,jq将直接将字符串内容打印到终端,而不是作为JSON转义字符串。

jq -r '.stack_trace'

答案 1 :(得分:3)

最初给出的输入不是完全有效的JSON,并且不清楚所需的输出是什么,但以下可能是有意义的。它是为当前版本的jq(版本1.5)编写的,但可以很容易地适用于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

输出:

$ 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
"

答案 2 :(得分:2)

除非你限制使用jq ,否则你可以用{{1}“修复”(或实际上是“un-json-ify”)jq输出}}:

sed

如果您在输入中碰巧有选项卡(JSON中为cat the-input | jq . | sed 's/\\n/\n/g' ),那么:

\t

如果您的cat the-input | jq . | sed 's/\\n/\n/g; s/\\t/\t/g' 是由Java生成的(您没有告诉日志的来源是什么),这将特别方便,因为Java堆栈跟踪行以stack_trace开头。

警告:当然,这不是正确的,从某种意义上说,包含<tab>at<space>的JSON输入将导致“”输出,但是它应该导致“n”输出。虽然不正确,但对人类窥视数据肯定是足够的。可以进一步改进\\n模式以照顾这一点(以可读性为代价)。