다른 JSON 문서에 JSON 문서가 포함되어 있습니다. 포함된 문서에서 데이터를 추출해야 하는데 JSON 또는 jq
.
내 입력은 다음과 같습니다( guard.json
).
{
"_index": "test-2021.06.02",
"_type": "servrd",
"_id": "ZWUxMDU5MjItOGY2MC00MGI5LWJhZTEtODRhYWQ1YTZhOGIy",
"_version": 1,
"_score": null,
"_source": {
"stream": "stdout",
"time": "2021-10-02T03:13:52.496705721Z",
"docker": {
"container_id": "392923402349320329432h3432k4kj32kfks9s9sdfksdfjkdsjfsh3939322342"
},
"kubernetes": {
"container_name": "test",
"namespace_name": "dev",
"pod_name": "test-dev-v004-9s885",
"container_image": "localhost:80/pg/test:1.19.0",
"container_image_id": "docker-pullable://localhost:80/pg/test@sha256:2sfdsfsfsfsfdsr3wrewrewc235e728ad1b29baf5af3dfad30c7706e5eda38b6109",
"pod_id": "ssfsfds-dsfdsfs-fs-sfsfs-sfdsfsdfsewrw",
"host": "test-jup-node008",
"labels": {
"app": "test",
"cluster": "test-dev",
"load-balancer-test-dev": "true",
"stack": "dev",
"app_kubernetes_io/managed-by": "spinnaker",
"app_kubernetes_io/name": "test",
"moniker_spinnaker_io/sequence": "4"
},
"min_url": "https://100.400.0.22:443/api",
"namespace_id": "jajdjsdf-dfse-dsf-koksls-sksjf030292",
"namespace_labels": {
"name": "dev"
}
},
"elapsedTime": 39013,
"message": "TransactionLog",
"membersId": "TEST_0233203203_030202020303",
"payload": "{\"serviceId\":\"00343\",\"AccessKey\":\"testdfsolpGS\",\"trackID\":\"KOLPSLSLSLL99029283\",\"membersId\":\"TEST_0233203203_030202020303\",\"shopperInfo\":{\"emailAddress\":\"[email protected]\",\"ipAddress\":\"localhost\"},\"parkid\":{\"parkssID\":\"carrier-park\"},\"cartinfo\":{\"checkType\":\"preorder\",\"detailsmetis\":\"card\",\"currency\":\"US\",\"grosscount\":\"10\",\"reedeem\":\".00\",\"Discount\":\".00\",\"tokenvalue\":{\"token\":\"11102020392023920920393993\",\"Bin\":\"00000\",\"digit\":\"0000\",\"expirationDate\":\"202509\",\"price\":\"10\"}},\"cartdetails\":[{\"dones\":[{\"donesnames\":\"test\",\"price\":\"003\",\"quan\":\"1\"}]}]}",
"requestDate": "2021-10-02T03:13:12.541207804Z",
"requestId": "12321321wes-sfsfdsf-snnm79887-029299",
"finalToClient": "{\"finalType\":\"ok\",\"evaluationMessage\":\"Accept\",\"subMessage\":\"testcallled\",\"score\":0}",
"serviceId": 00343,
"timestamp": "2021-10-02T03:13:51.951+00:00",
"@timestamp": "2021-10-02T03:13:52.621643399+00:00"
},
"fields": {
"@timestamp": [
"2021-10-02T03:13:52.621Z"
],
"requestDate": [
"2021-10-02T03:13:12.541Z"
],
"timestamp": [
"2021-10-02T03:13:51.951Z"
]
},
"highlight": {
"kubernetes.labels.app": [
"@kibana-highlighted-field@test@/kibana-highlighted-field@"
]
},
"sort": [
1654139632621
]
}
다음과 유사한 CSV 형식의 출력이 필요합니다.
serviceId, trackID, currency, grosscount
00343,KOLPSLSLSLL99029283,US,10
답변1
._source.payload
귀하의 질문은 다른 JSON 문서에 포함된 JSON 문자열()로 저장된 JSON 문서에 저장된 특정 정보를 추출하는 것에 관한 것입니다 .
데이터가 포함된 JSON 문서를 얻으려면 먼저 호스트 문서에서 문서의 압축을 풀어야 합니다.
jq -r '._source.payload' guard.json
귀하의 질문에 있는 예를 보면, 이것은 우리에게 뭔가를 줄 것입니다동등하다
{
"serviceId": "00343",
"AccessKey": "testdfsolpGS",
"trackID": "KOLPSLSLSLL99029283",
"membersId": "TEST_0233203203_030202020303",
"shopperInfo": {
"emailAddress": "[email protected]",
"ipAddress": "localhost"
},
"parkid": {
"parkssID": "carrier-park"
},
"cartinfo": {
"checkType": "preorder",
"detailsmetis": "card",
"currency": "US",
"grosscount": "10",
"reedeem": ".00",
"Discount": ".00",
"tokenvalue": {
"token": "11102020392023920920393993",
"Bin": "00000",
"digit": "0000",
"expirationDate": "202509",
"price": "10"
}
},
"cartdetails": [
{
"dones": [
{
"donesnames": "test",
"price": "003",
"quan": "1"
}
]
}
]
}
여기에서 제목이 있는 CSV로 .serviceId
, .trackID
및 .cartinfo.currency
을 선택해야 합니다 ..cartinfo.grosscount
우리는 할 수있어:
jq -r '._source.payload' guard.json |
jq -r '
[ "serviceId", "trackID", "currency", "grosscount" ],
[ .serviceId, .trackID, .cartinfo.currency, .cartinfo.grosscount ] |
@csv'
두 번째 jq
명령은 포함된 JSON 문서에서 정보를 추출합니다. 첫 번째 배열은 제목 문자열의 배열이고, 두 번째 배열은 각 열의 데이터를 추출하는 배열입니다. 그런 다음 연산자를 사용하여 이 두 배열의 형식을 지정하고 CSV로 출력합니다 @csv
.
페이로드(임베디드 JSON 문서)에 대한 단일 호출을 사용하여 jq
이를 수행 할 수도 있습니다.fromjson
jq -r '._source.payload | fromjson |
[ "serviceId", "trackID", "currency", "grosscount" ],
[ .serviceId, .trackID, .cartinfo.currency, .cartinfo.grosscount ] |
@csv' guard.json
질문의 데이터를 기반으로 하면 다음과 같습니다.
"serviceId","trackID","currency","grosscount"
"00343","KOLPSLSLSLL99029283","US","10"
추가된 비트(2022년 10월):
내장된 페이로드를 추출 하기 위해 jq
Miller는 결과 CSV를 생성합니다.
$ jq -r ._source.payload file | mlr --j2c cut -f serviceId,trackID,cartinfo:currency,cartinfo:grosscount then label serviceId,trackID,currency,grosscount
serviceId,trackID,currency,grosscount
00343,KOLPSLSLSLL99029283,US,10