JQ 如何从 json 值打印换行符而不是换行符
JQ how to print newline and not newline character from json value
我有一些日志在 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"
}
以此类推
是否可以让 Jq 打印换行符而不是 .stack_trace
值中看到的 \n 字符序列?
好的!使用 -r
选项,jq 将字符串内容直接打印到终端而不是 JSON 转义字符串。
jq -r '.stack_trace'
最初给出的输入不太有效 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
"
除非你限制使用 jq
仅 ,你可以 "fix"(或者实际上 "un-json-ify")jq
输出 sed
:
cat the-input | jq . | sed 's/\n/\n/g'
如果您碰巧在输入中也有制表符(\t
in JSON),那么:
cat the-input | jq . | sed 's/\n/\n/g; s/\t/\t/g'
如果您的 stack_trace
是由 Java 生成的(您没有说明日志的来源),这将特别方便,因为 Java 堆栈跟踪行开始<tab>at<space>
.
警告:当然,这不是 正确的 ,在某种意义上,包含 \n
的 JSON 输入将导致 "" 输出,但是它应该导致 "n" 输出。虽然不正确,但对于人类偷看数据来说肯定足够了。 sed
模式可以进一步改进以解决这个问题(以可读性为代价)。
我有一些日志在 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"
}
以此类推
是否可以让 Jq 打印换行符而不是 .stack_trace
值中看到的 \n 字符序列?
好的!使用 -r
选项,jq 将字符串内容直接打印到终端而不是 JSON 转义字符串。
jq -r '.stack_trace'
最初给出的输入不太有效 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
"
除非你限制使用 jq
仅 ,你可以 "fix"(或者实际上 "un-json-ify")jq
输出 sed
:
cat the-input | jq . | sed 's/\n/\n/g'
如果您碰巧在输入中也有制表符(\t
in JSON),那么:
cat the-input | jq . | sed 's/\n/\n/g; s/\t/\t/g'
如果您的 stack_trace
是由 Java 生成的(您没有说明日志的来源),这将特别方便,因为 Java 堆栈跟踪行开始<tab>at<space>
.
警告:当然,这不是 正确的 ,在某种意义上,包含 \n
的 JSON 输入将导致 "" 输出,但是它应该导致 "n" 输出。虽然不正确,但对于人类偷看数据来说肯定足够了。 sed
模式可以进一步改进以解决这个问题(以可读性为代价)。