json 터미널 출력의 '\t' 및 '\n'을 유용한 것으로 변환하는 방법은 무엇입니까?

json 터미널 출력의 '\t' 및 '\n'을 유용한 것으로 변환하는 방법은 무엇입니까?

AWS에서 일부 JSON 로그를 받았는데 이를 정리하고 싶습니다. 그들은 이렇게 생겼습니다 ...

    {
        "ingestionTime": 1568961184459, 
        "timestamp": 1568961184430, 
        "message": "START RequestId: 0304cf0d-da16-4d01-b4de-da8d528144ac Version: $LATEST\n", 
        "eventId": "34989003600358241981666605756070906630881684882471780352", 
        "logStreamName": "2019/09/20/[$LATEST]71cac888c4a54d11b7e2c97108ad8ba1"
    }, 
    {
        "ingestionTime": 1568961199507, 
        "timestamp": 1568961184432, 
        "message": "2019-09-20T06:33:04.432Z\t0304cf0d-da16-4d01-b4de-da8d528144ac\tAttempting to subscribe John Doe ([email protected]) to newsletter...\n", 
        "eventId": "34989003600402843472063667020546010973018230982964936704", 
        "logStreamName": "2019/09/20/[$LATEST]71cac888c4a54d11b7e2c97108ad8ba1"
    }, 

그런 다음... 다음을 사용하여...

{
  "ingestionTime": 1568961184459,
  "timestamp": 1568961184430,
  "message": "START RequestId: 0304cf0d-da16-4d01-b4de-da8d528144ac Version: $LATEST\n",
  "eventId": "34989003600358241981666605756070906630881684882471780352",
  "logStreamName": "2019/09/20/[$LATEST]71cac888c4a54d11b7e2c97108ad8ba1"
}
{
  "ingestionTime": 1568961199507,
  "timestamp": 1568961184432,
  "message": "2019-09-20T06:33:04.432Z\t0304cf0d-da16-4d01-b4de-da8d528144ac\tAttempting to subscribe John Doe ([email protected]) to newsletter ...\n",
  "eventId": "34989003600402843472063667020546010973018230982964936704",
  "logStreamName": "2019/09/20/[$LATEST]71cac888c4a54d11b7e2c97108ad8ba1"
}

이 명령은 다음과 같습니다.aws logs filter-log-events --log-group-name /aws/lambda/$npm_package_name --region us-east-2 | jq '.events[]'

\t이것이 실제로 탭이고 \n마지막 탭을 제거할 수 있다면 좋을 것입니다. 또는 각 새 탭의 메시지 필드를 여러 개의 새 줄로 나눕니다.

어떻게 해야 합니까? 나는 bash에 대해 충분히 모른다.

답변1

jq기본적으로 JSON으로 인코딩된 문자열이 출력됩니다.

당신이 원하는날것의 message문자열, 사용 -r또는 --raw-output:

jq -r .message file.json

( file.json표시 중인 JSON 문서인 경우) 그러면 해당 특정 문자열의 탭과 개행 문자가 확장됩니다.

답변2

Bash에서 JSON을 구문 분석하는 것은 결코 권장되지 않지만...

이 라인을 마사지할 수 있다면:

    "message": "newline\n\nword\tword\tword", 

이 되다:

X_message="newline\n\nword\tword\tword"

그런 다음 다음을 수행할 수 있습니다.

$ echo -e "$X_message"
newline

word    word    word

관련 정보