$ curl -LNs "http://urladrescom/content.json" > content.json
콘텐츠.json
{
"k":[
{
"i":1,
"n":"NAME 1",
"p":[
{
"b":"Event 1",
"c":"00:00",
"d":"03:00"
},
{
"b":"Event 2",
"c":"23:00",
"d":"00:00"
}
]
},
{
"i":2,
"n":"NAME 2",
"p":[
{
"b":"Event 1",
"c":"07:15",
"d":"09:15"
},
{
"b":"Event 2",
"c":"22:00",
"d":"23:15"
},
{
"b":"Event 3",
"c":"23:15",
"d":"02:30"
}
]
},
{
"i":3,
"n":"NAME 3",
"p":[
{
"b":"Event 1",
"c":"07:15",
"d":"09:15"
},
{
"b":"Event 2",
"c":"22:00",
"d":"23:15"
},
{
"b":"Event 3",
"c":"23:15",
"d":"02:30"
}
]
}
]
}
grep
awk
Bash 스크립트( , , sed
등)(또는 Bash 스크립트 cmd의 Python)를 사용하여 이벤트 1, 2, 3에서 "NAME 2"의 내용을 가져오고 싶습니다 .
결과를 인쇄하고 싶습니다.
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30
답변1
이 Python을 사용하여 원하는 작업을 수행할 수 있습니다.
$ cat parse.py
#!/bin/python
import json
#from pprint import pprint
with open('content.json') as f:
data = json.load(f)
for dict in data["k"]:
if (dict["n"] == "NAME 2"):
for elem in dict["p"]:
print(dict["n"] + ' \\ ' + elem["b"] + ' \\ ' + elem["c"] + ' \\ ' + elem["d"])
예
$ ./parse.py
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30
답변2
명령줄 JSON 파서 사용jq
...
이 작업을 수행하는 더 짧은 표현이 있을 수 있지만 jq
이것이 제가 생각해낸 것입니다.
$ jq -r --arg name "NAME 2" '.[][]|select(.n==$name).p[]|[$name,.[]]|join(" \\ ")' content.json
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30
또는 보다 선택적인 코드를 사용하여Steeldriver 권장 사항을 기반으로 함,
$ jq -r --arg name "NAME 2" '.k[]|select(.n==$name).p[]|[$name, .b, .c, .d]|join(" \\ ")' content.json
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30
name
jq
명령줄에서 값이 전달되는 변수 입니다 . 이 jq
코드는 다섯 가지 작업을 수행합니다.
k
데이터에서 관심 있는 배열을 추출합니다 .- 출력하려는 특정 배열(및 그 안의 비트)을 선택합니다
p
. - 출력용 배열을 만듭니다(이름은 데이터의 일부가 아니므로 삽입해야 함).
- 출력을 수행할 때 특정 구분 기호를 삽입합니다.