Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
创建bash脚本以从现有linux etc/hosts文件创建yaml文件_Bash_Yaml_Hosts - Fatal编程技术网

创建bash脚本以从现有linux etc/hosts文件创建yaml文件

创建bash脚本以从现有linux etc/hosts文件创建yaml文件,bash,yaml,hosts,Bash,Yaml,Hosts,我不熟悉脚本编写,但一直负责从现有的Linux/etc/hosts文件创建yaml文件。在此处使用主机文件: 127.0.0.1 localhost 192.168.1.2 host1 192.168.1.3 host2 192.168.1.4 host3 192.168.1.5 host4 ..要创建如下所示的yaml文件: host_entries: host1: ip: '192.168.1.2' host2: ip: '192.

我不熟悉脚本编写,但一直负责从现有的Linux/etc/hosts文件创建yaml文件。在此处使用主机文件:

127.0.0.1      localhost
192.168.1.2    host1
192.168.1.3    host2
192.168.1.4    host3
192.168.1.5    host4
..要创建如下所示的yaml文件:

host_entries:
  host1:
    ip: '192.168.1.2'
  host2:
    ip: '192.168.1.3'
  host3:
    ip: '192.168.1.4'
  host4:
    ip: '192.168.1.5'
我知道有不止一种方法可以达到理想的解决方案。但我不太确定如何编写脚本以获得正确的格式。如果您有任何建议,我们将不胜感激。

简单且错误(不保证输出对所有可能的输入都有效):

容易和错误(不能强烈保证输出对于所有可能的输入都是有效的YAML):


那么,到目前为止你试过什么?请先展示你的作品,然后请求社区帮助。我以前没有使用过,但是
awk
可以从bash直接完成。你只需要自己做一些研究,看看是什么样子的YAML文件,还是等效解析的YAML文件?由于YAML是JSON的超集,因此可以很容易地使用
jq
来完成任务。明确地说,使用
jq
将为您提供语法正确的输出的有力保证——用Python或类似语言编写到规范中的YAML模块也是如此。使用本机工具(无论是
bash
本身还是
awk
或类似工具)所做的任何事情都不会有这样的保证。@MikeVelazco,因为
awk
是它自己的独立语言,所以可以很容易地说Python可以从bash直接做到这一点。:)那么,到目前为止你试过什么?请先展示你的作品,然后请求社区帮助。我以前没有使用过,但是
awk
可以从bash直接完成。你只需要自己做一些研究,看看是什么样子的YAML文件,还是等效解析的YAML文件?由于YAML是JSON的超集,因此可以很容易地使用
jq
来完成任务。明确地说,使用
jq
将为您提供语法正确的输出的有力保证——用Python或类似语言编写到规范中的YAML模块也是如此。使用本机工具(无论是
bash
本身还是
awk
或类似工具)所做的任何事情都不会有这样的保证。@MikeVelazco,因为
awk
是它自己的独立语言,所以可以很容易地说Python可以从bash直接做到这一点。:)感谢这篇文章,它给了我一些关于如何从结构化输入生成yaml的好主意。感谢这篇文章,它给了我一些关于如何从结构化输入生成yaml的好主意。
{
  printf 'host_entries:\n'
  while read -r -a line; do
    [[ ${line[0]} ]] || continue             # skip blank lines
    [[ ${line[0]} = "#"* ]] && continue      # skip comments
    [[ ${line[0]} = 127.0.0.1 ]] && continue # skip localhost

    set -- "${line[@]}" # assign words read from line to current argument list
    ip=$1; shift        # assign first word from line to ip
    for name; do        # iterate over other words, treating them as names
      printf "  %s:\n    ip: '%s'\n" "$name" "$ip"
    done
  done
} </etc/hosts >yourfile.yaml
host_entries:
  host1:
    ip: '192.168.1.2'
  host2:
    ip: '192.168.1.3'
  host3:
    ip: '192.168.1.4'
  host4:
    ip: '192.168.1.5'