Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于python和bash解析的Yaml文件_Python_Bash - Fatal编程技术网

用于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。