从 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"
}

Demo

如果需要,添加 -c 选项会将输出变成一行:

lsb_release -a | jq -Rnc '…'
{"Release":"20.04","Codename":"focal"}

Demo