【发布时间】:2022-11-10 04:35:16
【问题描述】:
我正在解析看起来像的弹性日志
$ cat my_log_file.txt:
{"level": "INFO", "message": "foo"}
{"level": "WARN", "message": "bar"}
{"level": "WARN", "message": "baz"}
因为它们是每行一个,所以以前我使用jq -s 将它们放入一个可以运行map 的实际数组中:
jq -s 'map(.message) | unique' my_log_file.txt
现在我想只选择具有级别!=“INFO”的行。我应该可以只使用this cookbook recipe,但jq 再次遇到麻烦,因为每一行都是单独的对象而不是数组。
我不能使用 slurp,因为它不适用于以下命令:
jq 'select(."level" != "INFO")' my_log_file.txt
但是当我想再次映射到 .message 时,我得到了与之前不使用 slurp 时相同的错误:
$ jq 'select(."level" != "INFO") | map(.message) | unique' my_log_file.txt
jq: error (at <stdin>:90): Cannot index string with string "message"
如何在中途转换我的记录 - 选择完成后,将结果从
{"level": "WARN", "message": "bar"}
{"level": "WARN", "message": "bar"}
至
[
{"level": "WARN", "message": "bar"},
{"level": "WARN", "message": "bar"}
]
我听说inputs 是用来代替 slurp 的,但是当我尝试
$ jq 'select(."level" != "INFO") | [inputs]' my_log_file.txt
这忽略了我的select,我又得到了每条消息的列表。
【问题讨论】:
标签: jq