用于python和bash解析的Yaml文件
我有一个简单的主机名列表,例如:用于python和bash解析的Yaml文件,python,bash,Python,Bash,我有一个简单的主机名列表,例如: hostname1,hostname2,hostname3 (注意:如有必要,可以更改YAML文件的格式以便于解析) 我需要能够在python和bash中循环这个主机名列表 一个简单的索引数组可以用于此目的,因为唯一的属性是hostname,并且列表的深度永远不会超过1级 我知道我可以用下面开始的代码轻松地用Python解析它 如何将其解析为Bash数组 Python 2.7 import yaml with open('emc_hosts.yaml', 'r
hostname1,hostname2,hostname3
(注意:如有必要,可以更改YAML文件的格式以便于解析)
我需要能够在python和bash中循环这个主机名列表
一个简单的索引数组可以用于此目的,因为唯一的属性是hostname,并且列表的深度永远不会超过1级
我知道我可以用下面开始的代码轻松地用Python解析它
如何将其解析为Bash数组
Python 2.7
import yaml
with open('emc_hosts.yaml', 'r') as f:
doc = yaml.load(f)
doc = doc.split(",")
for v in doc:
print(v)
更新:主机名都在同一行,但它们不必在同一行。我可以创建任意格式的主机名文件,包括以返回或其他字符分隔的格式
更新2:该文件将只包含主机名列表
更新3:根据评论中的建议,我可以轻松地将其从YAML文件更改为主机名用新行分隔的简单文本文件。如果您已经有可用的Python代码,不妨使用它
# Embed your Python script into your bash code
_get_hosts_python=$(cat <<'EOF'
import yaml, sys
with open(sys.argv[1], "r") as f:
doc = yaml.load(f)
doc = doc.split(",")
for v in doc:
print(v)
EOF
)
# provide a function to wrap its invocation
get_hosts() {
IFS=$'\n' read -r -d '' -a "${1:-hosts}" \
< <(python -c "$_get_hosts_python" "emc_hosts.yml" && printf '\0')
}
# and demonstrate how to actually use that function
get_hosts hostlist
echo "Got ${#hostlist[@]} hosts:"
printf '- %s\n' "${hostlist[@]}"
#将Python脚本嵌入到bash代码中
_get_hosts_python=$(cat如果您已经有了可用的python代码,那么最好使用它
# Embed your Python script into your bash code
_get_hosts_python=$(cat <<'EOF'
import yaml, sys
with open(sys.argv[1], "r") as f:
doc = yaml.load(f)
doc = doc.split(",")
for v in doc:
print(v)
EOF
)
# provide a function to wrap its invocation
get_hosts() {
IFS=$'\n' read -r -d '' -a "${1:-hosts}" \
< <(python -c "$_get_hosts_python" "emc_hosts.yml" && printf '\0')
}
# and demonstrate how to actually use that function
get_hosts hostlist
echo "Got ${#hostlist[@]} hosts:"
printf '- %s\n' "${hostlist[@]}"
#将Python脚本嵌入到bash代码中
_get_hosts_python=$(cat您可以使用直接在shell/bash中解析yaml/json文件
易于安装和使用:
$ pip install -U niet
考虑以下示例:
$ cat dump.yaml
foo:
bar:
key: value
baz:
key: value
tags:
- one
- two
您可以按如下方式解析此示例文件:
$ niet dump.yaml foo.bar.key
value
$ for el in $(niet dump.yaml foo.tags); do echo ${el}; done
one
two
Niet与shell和其他bash类似的工具有很好的集成
另外,Niet正在使用python进行开发。您可以直接在shell/bash中使用语法解析yaml/json文件
易于安装和使用:
$ pip install -U niet
考虑以下示例:
$ cat dump.yaml
foo:
bar:
key: value
baz:
key: value
tags:
- one
- two
您可以按如下方式解析此示例文件:
$ niet dump.yaml foo.bar.key
value
$ for el in $(niet dump.yaml foo.tags); do echo ${el}; done
one
two
Niet与shell和其他bash类似的工具有很好的集成
Niet也在使用python进行开发。它们在同一条线上?此主机名文件中还有其他内容吗?最简单的方法(呃,更简单的方法,保证可以跨所有格式变量工作,尊重注释等)是将其从YAML过滤到JSON,并使用常规的基于jq
的尝试。为什么不使用一个简单的文本文件,每行一个主机名?这里没有足够的结构来保证使用YAML。它们在同一行上?这个主机名文件中还有其他内容吗?最简单的方法(呃,更简单的方法是保证在所有格式变体、尊重注释等中都能工作)是将其从YAML过滤到JSON,并使用基于jq
的常规尝试。为什么不只使用一个简单的文本文件,每行一个主机名?这里没有足够的结构来保证使用YAML。