如何使用 PyYAML 从 Bash 中查找 YAML 值
How to find a YAML value from Bash using PyYAML
我正在测试在 RHEL7 环境中使用 PyYAML v3.12 解析中等复杂 YAML 配置文件内容的可行性,方法是向其提供密钥并取回密钥对值。查询看起来像这样 python my_yaml_search.py key_to_search
并让它打印回 value
,例如:
所需的 bash 命令:python search_yaml.py $servername
期望的响应(仅值,不是键值):myServer14
到目前为止,我已经创建了以下 .py:
import sys
import yaml
key = sys.argv[1]
with open("config.yml") as f:
try:
data = yaml.safe_load(f)
for k, v in data.items():
if data[k].has_key(key):
print data[k][v]
except yaml.YAMLError as exc:
print "Error: key not found in YAML"
config.yml:
---
server:
servername: myServer14
filename: testfile.zip
location: http://test-location/1.com
repo:
server_name_fqdn: server.name.fqdn.com
port: 1234
到目前为止,运行 python search_yaml.py $servername
产生了一个 list index out of range
; python search_yaml.py servername
什么都不产生。
我是 Python/PyYAML 的新手,所以我假设我可能错误地向程序传递了一个变量,并且 sys 可能不是我需要的 Python 库,但是我在如何正确地做到这一点 - 任何输入都会拯救我的理智。
如果您知道要遍历的所有键,您可以这样做:
import sys
import yaml
key = sys.argv[1]
with open("config.yml") as f:
data = yaml.safe_load(f)
n = key.count('.')
parts = key.split('.')
res = None
i = 0
while i <= n:
try:
if not res:
res = data[parts[i]]
else:
res = res[parts[i]]
except (yaml.YAMLError, KeyError) as exc:
print ("Error: key not found in YAML")
res = None
i = i + 1
if res:
print(res)
测试
~# python search_yaml.py server.repo.port
~# 1234
~# python search_yaml.py server.servername
~# myServer14
这可能有错误,我编写代码只是为了看看它是否可以在没有 third-party 工具的情况下轻松完成。
YAML 的 CLI 应用程序
您可能对 yq
程序感兴趣。同名程序其实有两个,一个是用Go实现的,另一个是Python-based(可能比上面的代码更复杂):-)
Go-based yq
。
您可以从 GitHub 版本安装提供的 statically-compiled yq
二进制文件,或者使用 commercial GetPageSpeed 存储库中的 yum
安装,为了稍后的简单更新:
sudo yum -y install https://extras.getpagespeed.com/release-latest.rpm
sudo yum -y install yq
那么你可以简单地:
~# yq read config.yml server.servername
~# myServer14
我正在测试在 RHEL7 环境中使用 PyYAML v3.12 解析中等复杂 YAML 配置文件内容的可行性,方法是向其提供密钥并取回密钥对值。查询看起来像这样 python my_yaml_search.py key_to_search
并让它打印回 value
,例如:
所需的 bash 命令:python search_yaml.py $servername
期望的响应(仅值,不是键值):myServer14
到目前为止,我已经创建了以下 .py:
import sys
import yaml
key = sys.argv[1]
with open("config.yml") as f:
try:
data = yaml.safe_load(f)
for k, v in data.items():
if data[k].has_key(key):
print data[k][v]
except yaml.YAMLError as exc:
print "Error: key not found in YAML"
config.yml:
---
server:
servername: myServer14
filename: testfile.zip
location: http://test-location/1.com
repo:
server_name_fqdn: server.name.fqdn.com
port: 1234
到目前为止,运行 python search_yaml.py $servername
产生了一个 list index out of range
; python search_yaml.py servername
什么都不产生。
我是 Python/PyYAML 的新手,所以我假设我可能错误地向程序传递了一个变量,并且 sys 可能不是我需要的 Python 库,但是我在如何正确地做到这一点 - 任何输入都会拯救我的理智。
如果您知道要遍历的所有键,您可以这样做:
import sys
import yaml
key = sys.argv[1]
with open("config.yml") as f:
data = yaml.safe_load(f)
n = key.count('.')
parts = key.split('.')
res = None
i = 0
while i <= n:
try:
if not res:
res = data[parts[i]]
else:
res = res[parts[i]]
except (yaml.YAMLError, KeyError) as exc:
print ("Error: key not found in YAML")
res = None
i = i + 1
if res:
print(res)
测试
~# python search_yaml.py server.repo.port
~# 1234
~# python search_yaml.py server.servername
~# myServer14
这可能有错误,我编写代码只是为了看看它是否可以在没有 third-party 工具的情况下轻松完成。
YAML 的 CLI 应用程序
您可能对 yq
程序感兴趣。同名程序其实有两个,一个是用Go实现的,另一个是Python-based(可能比上面的代码更复杂):-)
Go-based yq
。
您可以从 GitHub 版本安装提供的 statically-compiled yq
二进制文件,或者使用 commercial GetPageSpeed 存储库中的 yum
安装,为了稍后的简单更新:
sudo yum -y install https://extras.getpagespeed.com/release-latest.rpm
sudo yum -y install yq
那么你可以简单地:
~# yq read config.yml server.servername
~# myServer14