Linux shell从yml文件中获取字段的值

时间:2015-04-30 13:48:45

标签: linux shell yaml

我有一个像

这样的database.yml文件
development:
  adapter: mysql2
  encoding: utf8
  database: d360
  host: localhost
  username: root
  password: password

test:
  adapter: mysql2
  encoding: utf8
  database: sample
  host: localhost
  username: root
  password: password

现在,我想要测试环境的数据库值(对于显示的YAML是sample)。 我们怎样才能用sed做到这一点?

5 个答案:

答案 0 :(得分:11)

这很容易,不是使用sed,而是使用适当的shell工具。首先,如果您需要在变量中保留sample以供日后使用,那么以下内容将使用bash substring replacement 来隔离{strong>测试中的sample :/ database:行:

$ db=$(grep -A3 'test:' database.yml | tail -n1); db=${db//*database: /}; echo "$db"
sample

或者对于可以转储到命令行的较短解决方案,删除变量和命令替换并使用cut之类的工具:

$ grep -A3 'test:' database.yml | tail -n1 | cut -c 13-
sample

或者,awk,只需:

$ grep -A3 'test:' database.yml | tail -n1 | awk '{ print $2}'
sample

可以在命令替换(即var=$(stuff))中使用所有不同的方式将sample存储在var中,这只是一个问题你宁愿用。我想你明白了。

答案 1 :(得分:5)

sed更好的工具。您可能会停留在最小的系统上,但其他人寻找答案可能不会

yq的python版本的作用类似于jq

$ pip install yq
$ yq -r .test.database database.yml
sample

shyaml也可以使用,但是有一个奇怪的限制,即您只能重定向到它:

$ pip install shyaml
$ shyaml get-value test.database < database.yml
sample

如果perl在附近并且您已安装YAML:

$ cpan YAML
$ perl -MYAML -le 'print YAML::LoadFile(shift)->{test}{database}' database.yml
sample

或者,如果您想要ruby

$ ruby -r yaml -e 'puts YAML.load_file(ARGV[0])["test"]["database"]' database.yml
sample

答案 2 :(得分:3)

YAML显然在shell中本身不受支持。但是sed也不是YAML解析器。也不是grep,tail,cut等。我很确定你需要一个真正的语言来编写一个合适的解析器。 awk,perl,python,erlang等。

如果你知道你的YAML数据总是以某种方式格式化或按特定顺序保存某些值,你可以使用sed或shell或者某些东西,但是要创建一个通常 的解析器>,以及任何ol&#39;您指向的YAML文件,您需要模拟已经存在于其他语言中的解析器。

如果您不想编写自己的代码(可能需要考虑一些代码后请求StackOverflow社区寻求帮助),那么一个选项可能是安装shyaml这样的工具,它可以准确无误解析文件并为您提供权威内容。虽然它有一些依赖项(python),但很容易在脚本中实现快速解决方案。

答案 3 :(得分:3)

在Ubuntu上: 安装yq

$ sudo apt update

$ sudo apt install snapd

$ sudo snap install yq

使用yq

$ value=$(yq r database.yml test.database)

答案 4 :(得分:1)

对于使用 Homebrew 的 macOS / Linux 用户,可以使用 yq,并提供类似 jq 的体验:

$ brew install yq
$ yq eval .test.database database.yml
sample