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