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