Estou jogando há algum tempo e pesquisando mas não consigo encontrar uma solução. Eu tenho alguns logs enormes, onde às vezes também existem JSONS enormes. Mas para simplificar imagine o seguinte:
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 '.'
É possível ver algo assim (o json como saída de jq '.' seria):
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"
}
Então, de alguma forma, detecte automaticamente os jsons ao imprimir o log e mostre-os como seria a saída para:
echo "{\"foo\": \"bar\"}" | jq '.'
{
"foo": "bar"
}
Responder1
O exemplo abaixo funcionou para o seu exemplo e parece razoável para mim. Estou iterando cada linha do arquivo de log e se uma linha corresponder ao regex "{.*}", ela será identificada como um objeto json e formatada com jq. Se o regex não corresponder, ele será impresso normalmente. Eu testei, funciona muito bem também para arquivos maiores e mais complexos.
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