繁体   English   中英

从 shell 脚本 output 创建 json

[英]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过滤器在输入上应用正则表达式,并将匹配项转换为 object
  • from_entries过滤器将具有键/值条目的对象数组减少为一个 object
  • {Release, Codename} object 生成器通过仅过滤某些字段来创建 object
lsb_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM