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

Nav*_*mar 12 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
Run Code Online (Sandbox Code Playgroud)

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

bri*_*foy 16

有比 更好的工具sed。您可能会被困在一个最小的系统上,但其他寻找答案的人可能不会

yq的 python 版本就像jq

$ pip install yq
$ yq -r .test.database database.yml
sample
Run Code Online (Sandbox Code Playgroud)

shyaml 也可以工作,但有一个奇怪的限制,你只能重定向到它:

$ pip install shyaml
$ shyaml get-value test.database < database.yml
sample
Run Code Online (Sandbox Code Playgroud)

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

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

或者,如果你想要ruby

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


Dav*_*ica 11

这很容易,不使用sed,但使用适当的shell工具.首先,如果你需要保留sample供以后使用一个变量,然后像下面的工作使用bash 字符串替换隔离sample测试:/数据库:行:

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

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

$ grep -A3 'test:' database.yml | tail -n1 | cut -c 13-
sample
Run Code Online (Sandbox Code Playgroud)

或者awk,简单地说:

$ grep -A3 'test:' database.yml | tail -n1 | awk '{ print $2}'
sample
Run Code Online (Sandbox Code Playgroud)

所有不同的方法都可以在命令替换(即var=$(stuff))存储sample中使用var,这只是你想要使用的问题.我想你应该已经明白了.

  • 这种类型的代码假设您知道输入文件的格式...如果是这种情况,为什么不`grep -m2 database | 尾部-1 | awk '{print $2}'`? (2认同)

all*_*lap 7

在 Ubuntu 上: 安装 yq

$ sudo apt update

$ sudo apt install snapd

$ sudo snap install yq

使用 yq

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


gho*_*oti 5

Shell本身不支持YAML。但是sed也不是YAML解析器。grep,tail,cut等都不是。我很确定您需要使用实际的语言来编写适当的解析器。AWK,Perl,Python,Erlang等

你可以用sed或外壳或诸如此类如果你知道你的YAML数据总是以某种方式进行格式化,或在一个特定的顺序保持一定的值,而是使解析器,将工作普遍的,任何醇” YAML文件,你指向它,您将需要模拟其他语言中已经存在的解析器。

如果您不想编写自己的文件(可能要在考虑一些代码后向StackOverflow社区寻求帮助),那么一种选择可能是安装诸如shyaml之类的工具,该工具可以准确地解析文件并为您提供权威的内容。尽管有一些依赖项(python),但快速解决方案可以轻松地在脚本中实现。

  • 这是一个更好的答案,将带来更好的解决方案(因为当 yaml 文件更改时,它们会中断更少......并且相信我 yaml 文件会更改)。 (2认同)