$ 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
我想使用 Bash 脚本( 、awk
、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
其中的位)。 - 创建一个用于输出的数组(由于名称不是数据的一部分,因此必须插入)。
- 执行输出时插入特定的分隔符。