从 shell 脚本输出创建 json
Create json from shell script output
我有一个 shell 脚本 version.sh,其中我有类似的代码。
#!/bin/sh
data = `lsb_release -a`
echo $data
它返回给我的输出如下:
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
所以我真正想要的是创建一个 JSON 文件。数据应该像
{'Release' : 20.04 , 'Codename' : focal}
我想以 JSON 形式打印数据。谁能帮我解决这个问题??我被困 here.any 建议任何帮助都很重要。
您可以使用 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)
查看输出:
按要求编辑(不使用任何包):
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)
输出:
不是 tagged or asked but with jq 通常是生成 and/or 操纵 JSON 数据 in/for shell
的最佳选择(实际上 是 标记,连同 bash
),这是使用 jq
的解决方案的样子:
-R
选项使输入行被解释为原始字符串
-n
选项使 inputs
关键字代表所有输入行的迭代器
[inputs | …]
数组生成器创建一个数组,每行输入一个项目
capture
过滤器对输入应用正则表达式,并将匹配转换为对象
from_entries
过滤器将具有 key/value 个条目的对象数组减少为一个对象
{Release, Codename}
对象生成器通过仅筛选特定字段来创建对象
lsb_release -a | jq -Rn '
[ inputs | capture("(?<key>.*):\s+(?<value>.*)") ]
| from_entries | {Release, Codename}
'
{
"Release": "20.04",
"Codename": "focal"
}
如果需要,添加 -c
选项会将输出变成一行:
lsb_release -a | jq -Rnc '…'
{"Release":"20.04","Codename":"focal"}
我有一个 shell 脚本 version.sh,其中我有类似的代码。
#!/bin/sh
data = `lsb_release -a`
echo $data
它返回给我的输出如下:
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
所以我真正想要的是创建一个 JSON 文件。数据应该像
{'Release' : 20.04 , 'Codename' : focal}
我想以 JSON 形式打印数据。谁能帮我解决这个问题??我被困 here.any 建议任何帮助都很重要。
您可以使用 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)
查看输出:
按要求编辑(不使用任何包):
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)
输出:
不是 tagged or asked but with jq 通常是生成 and/or 操纵 JSON 数据 in/for shell
的最佳选择(实际上 是 标记,连同 bash
),这是使用 jq
的解决方案的样子:
-R
选项使输入行被解释为原始字符串-n
选项使inputs
关键字代表所有输入行的迭代器[inputs | …]
数组生成器创建一个数组,每行输入一个项目capture
过滤器对输入应用正则表达式,并将匹配转换为对象from_entries
过滤器将具有 key/value 个条目的对象数组减少为一个对象{Release, Codename}
对象生成器通过仅筛选特定字段来创建对象
lsb_release -a | jq -Rn '
[ inputs | capture("(?<key>.*):\s+(?<value>.*)") ]
| from_entries | {Release, Codename}
'
{
"Release": "20.04",
"Codename": "focal"
}
如果需要,添加 -c
选项会将输出变成一行:
lsb_release -a | jq -Rnc '…'
{"Release":"20.04","Codename":"focal"}