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

jjg*_*ong 14 json newline jq

我有一些日志,以JSON格式输出信息.这是为了收集到elasticsearch.

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

以下是一些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"
}
Run Code Online (Sandbox Code Playgroud)

等等.

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

小智 35

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

jq -r '.stack_trace'
Run Code Online (Sandbox Code Playgroud)

  • 嗨,谢谢你。是否可以正常打印其他所有内容并仅使用 -r 作为 stack_trace 值?jq -r '.stack_trace' 将仅打印 stack_trace 而不是其余信息。 (2认同)

Pio*_*sen 8

除非您限制使用jq only,否则您可以“修复”(或实际上是“un-json-ify”)jq输出sed

cat the-input | jq . | sed 's/\\n/\n/g'
Run Code Online (Sandbox Code Playgroud)

如果您碰巧在输入中也有选项卡(\t在 JSON 中),则:

cat the-input | jq . | sed 's/\\n/\n/g; s/\\t/\t/g'
Run Code Online (Sandbox Code Playgroud)

如果您stack_trace是由 Java 生成的(您没有说明日志的来源是什么),这将特别方便,因为 Java 堆栈跟踪行以<tab>at<space>.

警告:当然,这是不正确的,从某种意义上说,包含 JSON 输入\\n将导致 "" 输出,但它应该导致 "n" 输出。虽然不正确,但对于人类窥视数据肯定足够了。该sed图案可以进一步改善照顾此(在可读性的费用)。

  • 弄清楚了:在管道传输结果时,“jq”似乎没有对输出进行着色。要强制“jq”为其输出着色,请使用“-C”标志。 (3认同)

pea*_*eak 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
Run Code Online (Sandbox Code Playgroud)

输出:

$ 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
"
Run Code Online (Sandbox Code Playgroud)