jq가 잘못된 JSON을 구문 분석할 수 있나요? :
[2023.06.07-21.58.47] StatManagerLog: {
"RoundState":
{
"State": "Starting",
"Timestamp": "2023.06.07-21.58.47"
}
}
[2023.06.07-21.58.47] StatManagerLog: {
"RoundState":
{
"State": "StandBy",
"Timestamp": "2023.06.07-21.58.47"
}
}
이상적으로는 각 StatManagerLog 객체가 jq에 의해 읽혀집니다.
jq가 이를 어떻게 수행하는지 알 수 없는 것 같습니다. 을 사용해 보았지만 -R
jq에서 명령을 실행하는 기능이 손실되었습니다. 이것이 가능합니까, 아니면 유효한 JSON으로 만들기 위해 먼저 파일을 전처리해야 합니까?
답변1
나는 그것에 대해 특별히 익숙하지는 않지만 jq
이 답변이 도움이 되기를 바랍니다.
고정된 구문에 따라 파일을 구문 분석하는 파서 작성은 종종 복잡하고 고통스러운 작업입니다.
오류를 수정하는 파서를 작성하는 것은 완전히 다른 수준입니다. 얼마나 복잡한지 상상조차 할 수 없습니다!
표시되는 입력을 "수정"할 수 있는 다양한 방법에 대해 생각해 보세요.
어쩌면 이는 and [2023.06.07-21.58.47]
대신에 , 즉 6개 항목의 배열을 의미할 수도 있습니다 . 그러면 나머지는 어떻게 해야 할까요?,
.
-
[2023,06,07,21,58,47]
어쩌면 모든 것을 [2023.06.07-21.58.47] StatManagerLog:
버려야할까요? 그러면 파일은 단일 JSON이 아니라 jq
이를 처리할 수 있는 것으로 보이는 여러 개의 연결된 JSON 파일입니다.
어쩌면 이것이 의미하는 바 "[2023.06.07-21.58.47] StatManagerLog":
는 키 주위의 큰따옴표가 누락되고 {
}
전체 파일을 캡슐화하는 큰 외부 쌍이 누락되었다는 것입니다.
나는 다른 가능성이 있다고 확신하며 이 크기 정도를 수정하면 파일을 유효한 JSON으로 만들 수 있습니다. 파서는 어느 것을 선택할지 모릅니다.
이는 음성 언어와 유사합니다. 전체 문장을 명확하게 듣지 못한 적이 몇 번인지 생각해보고 뇌가 듣지 못한 부분을 자동으로 교정할 수 없기 때문에 다시 물어보십시오. 아마도 문장을 교정하는 방법을 두 가지 이상 상상할 수 있기 때문일 것입니다. 결과의 의미.
간단히 말해서, 데이터를 수정해야 하는 방법과 원래 의도가 무엇인지 아는 사람은 파서가 이를 알아낼 기회가 없습니다. 입력하기 전에 일부 텍스트 처리 도구( sed
, 등) awk
를 사용하여 cut
수정하세요 jq
. 또는 이 데이터를 내보내는 사람이 올바른 JSON을 내보내도록 수정하세요.
답변2
[
{
a로 시작하는 모든 줄을 유효한 JSON으로 바꾸거나 적어도 jq
처리할 수 있는 유효한 JSON을 연결 하여 파일을 전처리합니다 .
$ sed 's/^\[.*/{/' file | jq -c .
{"RoundState":{"State":"Starting","Timestamp":"2023.06.07-21.58.47"}}
{"RoundState":{"State":"StandBy","Timestamp":"2023.06.07-21.58.47"}}
삭제된 정보에는 이미 출력에 포함된 데이터(타임스탬프)와 정적 문자열()이 포함되어 있으므로 삭제된 정보가 필요하지 않다고 가정합니다 StatManagerLog
.
그런 다음 상태 또는 타임스탬프 등 원하는 항목을 선택할 수 있습니다.
$ sed 's/^\[.*/{/' file | jq -c --arg q 2023.06.07-21.58.47 'select(.RoundState.Timestamp == $q)'
{"RoundState":{"State":"Starting","Timestamp":"2023.06.07-21.58.47"}}
{"RoundState":{"State":"StandBy","Timestamp":"2023.06.07-21.58.47"}}
$ sed 's/^\[.*/{/' file | jq -c --arg q StandBy 'select(.RoundState.State == $q)'
{"RoundState":{"State":"StandBy","Timestamp":"2023.06.07-21.58.47"}}
...또는 필요한 집계를 더욱 복잡하게 선택하여 수행할 수도 있습니다.