JSON を視覚化するために、JSON を含む混合データを含む「tail -f」を jq にパイプできますか?

JSON を視覚化するために、JSON を含む混合データを含む「tail -f」を jq にパイプできますか?

しばらくプレイして調査していますが、解決策が見つかりません。巨大なログがいくつかあり、巨大な JSON も時々あります。しかし、簡単にするために、次のことを想像してください。

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

関連情報