我有一些日志,以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)
除非您限制使用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图案可以进一步改善照顾此(在可读性的费用)。
最初给出的输入不是完全有效的 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)