我玩了一段时间并进行了研究,但还是找不到解决方案。我有一些巨大的日志,有时还有巨大的 JSONS。但为了简化,想象一下以下内容:
mkdir logs
cd logs/
echo "$(date) [INFO] something" >> huge_log.log
echo "$(date) [INFO] something more" >> huge_log.log
echo "$(date) [INFO] Something with json: {\"foo\": \"bar\"}" >> huge_log.log
tail -n 5 -f huge_log.log | how_to_filter? | jq '.'
是否可以看到类似这样的内容(jq'.'输出的 json 将是):
Tue Aug 18 12:42:24 CEST 2020 [INFO] something
Tue Aug 18 12:42:29 CEST 2020 [INFO] something more
Tue Aug 18 12:43:05 CEST 2020 [INFO] Something with json:
{
"foo": "bar"
}
因此,以某种方式,在打印日志时自动检测 json 并将它们显示为输出:
echo "{\"foo\": \"bar\"}" | jq '.'
{
"foo": "bar"
}
答案1
下面的方法适用于您的示例,并且对我来说似乎很合理。我遍历日志文件中的每一行,如果一行与正则表达式“{.*}”匹配,则将其标识为 json 对象,然后使用 jq 进行格式化。但是,如果正则表达式不匹配,则会打印出正常内容。我测试了它,它实际上对更大更复杂的文件也非常有效。
tail -n 15 huge_log.log | while read line ; do if echo $line | egrep "\{.*}" >/dev/null;json=$(echo $line | egrep -oh "\{.*}" | jq '.');then echo $line | awk -v json="$json" -F "\{.*}" '{printf "%s\n%s\n%s\n",$1,json,$2}'; fi; done