{
"auth": 'log',
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
}
24/10/2017 12:44:24
--------------------------------------------------------------------------------
{
"auth": 'log',
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
}
파일의 일부 로그 줄로 구분된 json 목록을 단일 json으로 변환해야 합니다. 지금까지 나는 이것을 시도했습니다 :
tac tst.txt | sed '/---------/I,+2 d' | tac > out.json
로그 줄을 삭제했는데 쉼표로 바꾸고 목록에 추가해야 합니다. 어떻게 해야 하나요? 아니면 Python을 사용하는 대안이 있습니까?
답변1
sed
+jq
해결책:
sed -E "/^(---|[0-9][0-9])/d; s/'([^']+)'/\"\1\"/" tst.txt | jq -s '' out.json
/^(---|[0-9][0-9])/d
---
- 또는 2자리로 시작하는 불필요한 줄을 제거합니다.s/'([^']+)'/\"\1\"/"
- 작은따옴표로 묶인 값을 유효한 JSON 값으로 바꿉니다(큰따옴표로 묶음).jq -s ''
- 입력의 모든 JSON 객체에 대해 필터를 실행하는 대신 전체 입력 스트림을 하나의 큰 배열로 읽습니다.
콘텐츠 out.json
:
[
{
"auth": "log",
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
},
{
"auth": "log",
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
}
]
답변2
주변 따옴표가 log
큰 따옴표로 수정되었다고 가정하면 다음을 사용하십시오 sed
.
sed -e '1s/^/[/' \
-e '$s/$/]/' \
-e 's/^-.*$/,/' \
-e '/^[0-9]/d' file | jq .
표현 sed
:
[
입력의 첫 번째 줄 시작 부분에 a를 삽입합니다.]
입력의 마지막 줄 끝에 하나를 삽입하십시오.-
단일 쉼표로 시작하는 모든 줄을 바꿉니다.- 임의의 숫자로 시작하는 줄을 삭제합니다.
호출은 jq
선택 사항입니다(형식만 정리합니다).
산출:
[
{
"auth": "log",
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
},
{
"auth": "log",
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
}
]
jq -s
또는 를 사용하는 짧은 대안 jq --slurp
:
sed -e '/^[-0-9]/d' file | jq -s