Можно ли передать «tail -f» со смешанными данными, содержащими JSON, в jq для визуализации JSON?

Можно ли передать «tail -f» со смешанными данными, содержащими JSON, в jq для визуализации JSON?

Я играю уже некоторое время и исследую, но не могу найти решение. У меня есть огромные логи, где иногда есть также огромные 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 '.'

Возможно ли увидеть что-то вроде этого (json как вывод jq '.' будет):

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

Связанный контент