JSON을 시각화하기 위해 JSON이 포함된 혼합 데이터가 포함된 "tail -f"를 jq로 파이프할 수 있나요?

JSON을 시각화하기 위해 JSON이 포함된 혼합 데이터가 포함된 "tail -f"를 jq로 파이프할 수 있나요?

한동안 플레이하고 연구했지만 해결책을 찾을 수 없습니다. 나는 때때로 거대한 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 '.'

다음과 같은 것을 볼 수 있습니까? (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

관련 정보