【问题标题】:iterate through yaml using shell使用 shell 遍历 yaml
【发布时间】:2024-01-23 12:39:01
【问题描述】:

我有一个 config_file.yml 文件:

sample:
    sql: "select * from dbname.tableName where sampleDate>='2018-07-20';"
    config: {'hosts': [!!python/tuple ['192.162.0.10', 3001]]}

sample2:
    sql: "select * from dbname.tableName where sampleDate<='2016-05-25';"
    config: {'hosts': [!!python/tuple ['190.160.0.10', 3002]]}

我想使用 shell 脚本遍历它的键值对直到 EOF。基本上我希望能够遍历每个 sql 直到 EOF,并在 shell 循环中执行每个 sql。

尝试查看很多文档,但他们没有足够的信息来了解如何使用 shell 循环遍历 yaml。

任何想法或示例都会非常有帮助...

谢谢!

编辑:

我已经在使用 ->

parse_yaml() {
local prefix=$2
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 |
awk -F$fs '{
  indent = length($1)/2;
  vname[indent] = $2;
  for (i in vname) {
     if (i > indent) {delete vname[i]}}
  if (length($3) > 0) {
     vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
     printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
  }
}'
}
# read yaml file
eval $(parse_yaml config_file.yml "")
# access yaml content
echo $sample_sql

我无法理解如何迭代。

【问题讨论】:

标签: bash shell loops yaml


【解决方案1】:

你为什么不能使用python?

它应该预装在大多数 linux 发行版中,这意味着您不必重新发明*!

设置:

pip install pyyaml

那么你的脚本是:

import yaml
f = open('config_file.yml')
yaml_file = yaml.safe_load(f)
for sample in yaml_file:
    print yaml_file[sample]["sql"]

运行:

python <script_name>.py

【讨论】:

  • 如 PyYAML 文档中指定的 yaml.load() 可能是不安全的。没有理由使用它,而不是 yaml.safe_load()。您也不应该使用 pip 安装来污染系统的 Python 安装,始终为您的实用程序创建一个 virtualenv,因此 pip 安装不会破坏您的系统。
  • 是的,我终于切换到 python ......这很好用
【解决方案2】:

您可以将greppcregrep 与以下内容一起使用:

$ while read -r line; do
  echo $line
done < <(grep -oP "sql: \"\K.+?(?=\")" config_file.yml)

输出:

select * from dbname.tableName where sampleDate>='2018-07-20';
select * from dbname.tableName where sampleDate<='2016-05-25';

在 macOS 中,您可以使用 pcregrep -o "sql: \"\K.+?(?=\")" config_file.yml

\K 可以被解读为排除它之前左侧的所有内容,并且只返回右侧部分 .+?(?=\"),直到找到 "

现在,如果您的yaml 更复杂,您也可以尝试yq (pip install yq),然后,例如,要获得sql 值,您可以这样做:

$ yq -r '.sample.sql' config_file.yml

【讨论】: