从现有的Linux etc/hosts文件创建yaml文件的Bash脚本

3

我是一个新手脚本编写者,但被要求从现有的Linux /etc/hosts文件中创建yaml文件。使用以下hosts文件:

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'

我知道有多种方法可以达到所需的解决方案。但我不太确定如何以正确的格式编写脚本。如果您有任何建议,将不胜感激。


1
你到目前为止尝试了什么?请先展示你的工作,然后再寻求社区帮助。 - uTeisT
我以前没有用过,但是 awk 可以直接在 bash 中完成。你只需要自己做一些研究。 - MikeVelazco
明确一点,使用 jq 将为您提供语法正确的强大保证 -- 在 Python 或类似语言中编写符合规范的 YAML 模块也将具有相同的效果。而任何使用本地工具(无论是 bash 本身还是 awk 或类似工具)所进行的操作都不会提供此类保证。 - Charles Duffy
@MikeVelazco,由于awk是自己的独立语言,所以同样可以说Python也可以从bash中正确执行它 :) - Charles Duffy
关于我之前所做的“看起来像”你给出的输出和“解析等同于”你给出的输出之间的区别,任何符合YAML规范的程序都将以与您描述的目标输出完全相同的方式处理具有以下内容的文件--这些内容同时是有效的YAML和有效的JSON:{"host_entries": {"host4": {"ip": "192.168.1.5"}, "host3": {"ip": "192.168.1.4"}, "host2": {"ip": "192.168.1.3"}, "host1": {"ip": "192.168.1.2"}}} - Charles Duffy
显示剩余3条评论
1个回答

6

简单易错方法(不能保证输出对所有可能的输入都是有效的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

如果要获得更短且有误的版本,请参见编辑历史记录(早期版本也适用于您的示例输入,但无法正确处理空行、注释、具有多个主机名的IP等)。

以您的确切主机文件作为输入,此代码会输出:

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。 - Lance Haig
我之前指出这个答案是“错误”的,有很好的理由。最好使用像 jq 这样的工具(所有有效的 JSON 也都是有效的 YAML)。 - Charles Duffy
完全同意 :-) 自这个问题以来,事情已经有所发展。 - Lance Haig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接