しばらくプレイして調査していますが、解決策が見つかりません。巨大なログがいくつかあり、巨大な 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