Llevo un tiempo jugando e investigando pero no encuentro solución. Tengo algunos registros enormes, donde a veces también hay JSONS enormes. Pero para simplificar imagine lo siguiente:
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 '.'
¿Es posible poder ver algo como esto (el json como salida de jq '.' sería):
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"
}
Entonces, de alguna manera, detecte automáticamente los json mientras imprime el registro y muéstrelos como sería el resultado para:
echo "{\"foo\": \"bar\"}" | jq '.'
{
"foo": "bar"
}
Respuesta1
Lo siguiente funcionó para su ejemplo y me parece razonable. Estoy iterando sobre cada línea en el archivo de registro y si una línea coincide con la expresión regular "{.*}", se identifica como un objeto json y luego se formatea con jq. Sin embargo, si la expresión regular no coincide, se imprime normalmente. Lo probé, funciona muy bien también para archivos más grandes y complejos.
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