다음 데이터베이스 쿼리가 있습니다.
select hostname,size from tableinfo
출력은 다음과 같습니다:
hostname size
------------------------- -----------
host1 28
host2 13
host3 79
host4 28
host5 17
또는 다음과 같이 할 수 있습니다.
host1 28
host2 13
host3 79
host4 28
host5 17
이 출력을 JSON으로 변환하는 쉘 스크립트를 작성하고 싶지만 어디서 시작해야 할지, 무엇을 해야 할지 잘 모르겠습니다. JSON은 다음과 같아야 합니다.
{
"data":[
{ "{#HOSTNAME}":"host1", "{#SIZE}":"28" } ,
{ "{#HOSTNAME}":"host2", "{#SIZE}":"13" } ,
{ "{#HOSTNAME}":"host3", "{#SIZE}":"79" } ,
{ "{#HOSTNAME}":"host4", "{#SIZE}":"28" } ,
{ "{#HOSTNAME}":"host5", "{#SIZE}":"17" }
]
}
답변1
jq
해결책:
<your sql output> | jq -Rs '{"data": [split("\n") | map(select(length > 0))[]
| split(" +";"g")
| {"{#HOSTNAME}": .[0], "{#SIZE}": .[1]}]}'
산출:
{
"data": [
{
"{#HOSTNAME}": "host1",
"{#SIZE}": "28"
},
{
"{#HOSTNAME}": "host2",
"{#SIZE}": "13"
},
{
"{#HOSTNAME}": "host3",
"{#SIZE}": "79"
},
{
"{#HOSTNAME}": "host4",
"{#SIZE}": "28"
},
{
"{#HOSTNAME}": "host5",
"{#SIZE}": "17"
}
]
}
답변2
이것이 SQLite3 데이터베이스라고 가정합니다(다른 데이터베이스 엔진에는 JSON 출력을 생성하는 고유한 기본 방법이 있습니다).
sqlite3 database.db \
'.mode json' \
'SELECT hostname AS `{#HOSTNAME}`, size AS `{#SIZE}` FROM tableinfo' |
jq '{ data: . }'
데이터베이스에서 JSON 형식의 데이터를 배열로 가져와 키 아래의 개체 jq
에 삽입합니다 . data
SELECT 쿼리는 필요에 따라 호스트 이름과 크기에 사용되는 키 이름을 변경합니다.
그러면 요청한 것과 동일한 JSON 문서가 제공됩니다.
{
"data": [
{
"{#HOSTNAME}": "host1",
"{#SIZE}": "28"
},
{
"{#HOSTNAME}": "host2",
"{#SIZE}": "13"
},
{
"{#HOSTNAME}": "host3",
"{#SIZE}": "79"
},
{
"{#HOSTNAME}": "host4",
"{#SIZE}": "28"
},
{
"{#HOSTNAME}": "host5",
"{#SIZE}": "17"
}
]
}
네가 원한다면정밀한언급한 출력 형식을 선택한 후 jq
위 파이프라인의 명령을 다음으로 바꿉니다.jtc
주문하다:
jtc -T '{"data": {{}} }' -tc
그러면 읽은 데이터가 sqlite3
키 값으로 템플릿 에 삽입 data
되고 다음과 같은 "세미 컴팩트" 예쁜 인쇄 출력 형식이 생성 -tc
됩니다 .jtc
{
"data": [
{ "{#HOSTNAME}": "host1", "{#SIZE}": "28" },
{ "{#HOSTNAME}": "host2", "{#SIZE}": "13" },
{ "{#HOSTNAME}": "host3", "{#SIZE}": "79" },
{ "{#HOSTNAME}": "host4", "{#SIZE}": "28" },
{ "{#HOSTNAME}": "host5", "{#SIZE}": "17" }
]
}
표 형식 데이터(2개의 간단한 열)에서 다음을 사용할 수 있습니다.밀러( mlr
)초기 배열을 만들고 동일한 jq
또는 명령을 사용하여 해당 키 아래에 jtc
모두 삽입합니다 .data
$ mlr --n2j -S label '{#HOSTNAME},{#SIZE}' file | jtc -T '{ "data": {{}} }' -tc
{
"data": [
{ "{#HOSTNAME}": "host1", "{#SIZE}": "28" },
{ "{#HOSTNAME}": "host2", "{#SIZE}": "13" },
{ "{#HOSTNAME}": "host3", "{#SIZE}": "79" },
{ "{#HOSTNAME}": "host4", "{#SIZE}": "28" },
{ "{#HOSTNAME}": "host5", "{#SIZE}": "17" }
]
}
나는 and ("도구 상자 인덱스 형식의 데이터 읽기, JSON 작성")에 대한 약어를 사용 --n2j
하고 Miller가 크기 데이터가 (문자열로 처리하는 대신) 정수여야 한다고 추론하는 것을 막기 위해 무언가를 추가했습니다.--inidx
--ojson
-S