[英]Create json from shell script output
我有一个 shell 脚本 version.sh,其中我有类似的代码。
#!/bin/sh
data = `lsb_release -a`
echo $data
它返回给我 output,如下所示:
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
所以我真正想要的是要创建一个 JSON 文件。数据应该像
{'Release' : 20.04 , 'Codename' : focal}
我想打印 JSON 表格中的数据。有人可以帮我解决这个问题吗?? 我被困在这里。任何帮助的建议都很重要。
您可以使用 python ttp 模块来获取此数据。 请参阅以下示例:
from ttp import ttp
import json
data_to_parse = """
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
"""
ttp_template = """
Release: {{release}}
Codename: {{codename}}
"""
parser = ttp(data=data_to_parse, template=ttp_template)
parser.parse()
# print result in JSON format
results = parser.result(format='json')[0]
#print(results)
#converting str to json.
result = json.loads(results)
print(result)
见output:
按要求编辑(不使用任何包):
data_to_parse = """
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
"""
lines = data_to_parse.splitlines()
result = {}
for line in lines:
if 'Release:' in line:
line2 = line.split(':')
result['Release'] = (line2[1].strip())
elif 'Codename:' in line:
line2 = line.split(':')
result['Codename'] = (line2[1].strip())
print(result)
查看结果:
编辑2.时间:
新数据:
data_to_parse = """
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 22.04
Codename: local
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 21.04
Codename: cocal
"""
代码:
lines = data_to_parse.splitlines()
result_list = []
result2 = {}
result_list3 = []
for line in lines:
if 'Release:' in line:
line2 = line.split(':')
result_list.append({'Release': line2[1].strip()})
elif 'Codename:' in line:
line2 = line.split(':')
result_list.append({'Codename': line2[1].strip()})
result2 = {**result_list[0], **result_list[1]}
result_list3.append(result2)
result_list = []
print(result_list3)
output:
没有标记或询问,但jq通常是生成和/或操作 shell 中的shell
数据的最佳选择(它确实被标记,连同bash
),这里是使用jq
的解决方案的样子:
-R
选项使输入行被解释为原始字符串-n
选项使inputs
关键字代表所有输入行的迭代器[inputs | …]
[inputs | …]
数组生成器创建一个数组,每个输入行包含一个项目capture
过滤器在输入上应用正则表达式,并将匹配项转换为 objectfrom_entries
过滤器将具有键/值条目的对象数组减少为一个 object{Release, Codename}
object 生成器通过仅过滤某些字段来创建 objectlsb_release -a | jq -Rn '
[ inputs | capture("(?<key>.*):\\s+(?<value>.*)") ]
| from_entries | {Release, Codename}
'
{
"Release": "20.04",
"Codename": "focal"
}
如果需要,添加-c
选项会将 output 变成一行:
lsb_release -a | jq -Rnc '…'
{"Release":"20.04","Codename":"focal"}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.