繁体   English   中英

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

[英]Linux shell get value of a field from a yml file

我有一个 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

现在,我想测试环境(即数据库的价值sample所显示的YAML)。 我们如何使用 sed 做到这一点?

这相当简单,不是使用sed ,而是使用适当的 shell 工具。 首先,如果您需要将sample保存在变量中以备后用,那么类似以下内容将使用 bash子字符串替换来隔离Test:/database:行上的sample

$ 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 ,这只是您更愿意使用的问题。 我想你应该已经明白了。

有比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

显然,shell 本身并不支持 YAML。 但是 sed 也不是 YAML 解析器。 grep、tail、cut 等都不是。我很确定您需要一种实际的语言来编写合适的解析器。 awk、perl、python、erlang 等

如果您知道您的 YAML 数据将始终以某种方式格式化或以特定顺序保存某些值,您可以使用 sed 或 shell 或类似的东西,但要制作一个通用的解析器,并且在任何 ol' YAML 文件上,您指向它,您需要模拟其他语言中已经存在的解析器。

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

在 Ubuntu 上:安装 yq

$ sudo apt update

$ sudo apt install snapd

$ sudo snap install yq

使用 yq

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM