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
现在,我想要测试环境数据库的值(对于显示的 YAML,即 sample
)。
我们如何使用 sed 做到这一点?
这相当简单,不使用 sed
,而是使用适当的 shell 工具。首先,如果您需要在变量中保留 sample
以备后用,那么使用 bash 子字符串替换 隔离 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 }'
sample
在命令替换(即var=$(stuff)
)中可以使用所有不同的方式将sample
存储在var
中,它是只是您更愿意使用的问题。我想你明白了。
YAML 显然在 shell 中不受原生支持。但 sed 也不是 YAML 解析器。 grep、tail、cut 等也不是。我很确定您需要一个实际的 language 来编写适当的解析器。 Awk、perl、python、erlang 等
如果您知道您的 YAML 数据将始终以特定方式格式化或以特定顺序保存特定值,您可以使用 sed 或 shell 或类似的东西,但要制作一个解析器可以工作 通常,并且在您指向的任何旧 YAML 文件上,您需要模拟其他语言中已经存在的解析器。
如果您不想自己编写(一旦您有一些代码需要考虑,可能会向 Whosebug 社区寻求帮助),那么一个选择可能是安装像 shyaml 这样的工具,它可以准确地解析文件并为您提供权威内容。一个快速的解决方案,很容易在您的脚本中实现,尽管它有一些依赖性 (python)。
有比 sed
更好的工具。您可能会被困在一个最小的系统上,但其他寻找答案的人可能不会。
$ pip3 install yq
$ yq -r .test.database database.yml
sample
shyaml 也可以,但有一个奇怪的限制,您只能重定向到它:
$ pip3 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
在 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
我有一个 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 做到这一点?
这相当简单,不使用 sed
,而是使用适当的 shell 工具。首先,如果您需要在变量中保留 sample
以备后用,那么使用 bash 子字符串替换 隔离 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 }'
sample
在命令替换(即var=$(stuff)
)中可以使用所有不同的方式将sample
存储在var
中,它是只是您更愿意使用的问题。我想你明白了。
YAML 显然在 shell 中不受原生支持。但 sed 也不是 YAML 解析器。 grep、tail、cut 等也不是。我很确定您需要一个实际的 language 来编写适当的解析器。 Awk、perl、python、erlang 等
如果您知道您的 YAML 数据将始终以特定方式格式化或以特定顺序保存特定值,您可以使用 sed 或 shell 或类似的东西,但要制作一个解析器可以工作 通常,并且在您指向的任何旧 YAML 文件上,您需要模拟其他语言中已经存在的解析器。
如果您不想自己编写(一旦您有一些代码需要考虑,可能会向 Whosebug 社区寻求帮助),那么一个选择可能是安装像 shyaml 这样的工具,它可以准确地解析文件并为您提供权威内容。一个快速的解决方案,很容易在您的脚本中实现,尽管它有一些依赖性 (python)。
有比 sed
更好的工具。您可能会被困在一个最小的系统上,但其他寻找答案的人可能不会。
$ pip3 install yq
$ yq -r .test.database database.yml
sample
shyaml 也可以,但有一个奇怪的限制,您只能重定向到它:
$ pip3 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
在 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