Как я могу разобрать файл YAML из сценария оболочки Linux? - PullRequest
155 голосов
/ 16 февраля 2011

Я хочу предоставить структурированный файл конфигурации, который как можно проще для нетехнического пользователя редактировать (к сожалению, это должен быть файл), и поэтому я хотел использовать YAML.Однако я не могу найти какой-либо способ синтаксического анализа этого из сценария оболочки Unix.

Ответы [ 16 ]

4 голосов
/ 11 октября 2013
perl -ne 'chomp; printf qq/%s="%s"\n/, split(/\s*:\s*/,$_,2)' file.yml > file.sh
1 голос
/ 29 октября 2018

Вы можете использовать эквивалент из yq , который написан на голанге:

./go-yg -yamlFile /home/user/dev/ansible-firefox/defaults/main.yml -key
firefox_version

возвращается:

62.0.3
1 голос
/ 23 июня 2018

Если у вас есть Python 2 и PyYAML, вы можете использовать этот парсер, который я написал, который называется parse_yaml.py . Некоторые из более простых вещей, которые он делает, позволяют вам выбрать префикс (в случае, если у вас более одного файла с одинаковыми переменными) и выбрать одно значение из файла yaml.

Например, если у вас есть эти файлы yaml:

staging.yaml:

db:
    type: sqllite
    host: 127.0.0.1
    user: dev
    password: password123

prod.yaml:

db:
    type: postgres
    host: 10.0.50.100
    user: postgres
    password: password123

Вы можете загрузить оба без конфликта.

$ eval $(python parse_yaml.py prod.yaml --prefix prod --cap)
$ eval $(python parse_yaml.py staging.yaml --prefix stg --cap)
$ echo $PROD_DB_HOST
10.0.50.100
$ echo $STG_DB_HOST
127.0.0.1

И даже вишня выбирает нужные вам значения.

$ prod_user=$(python parse_yaml.py prod.yaml --get db_user)
$ prod_port=$(python parse_yaml.py prod.yaml --get db_port --default 5432)
$ echo prod_user
postgres
$ echo prod_port
5432
1 голос
/ 15 мая 2018

Я знаю, что это очень специфично, но я думаю, что мой ответ может быть полезен для определенных пользователей.
Если на вашем компьютере установлены node и npm, вы можете использовать js-yaml.
Сначала установите:

npm i -g js-yaml
# or locally
npm i js-yaml

, затем в вашем bash-скрипте

#!/bin/bash
js-yaml your-yaml-file.yml

Также, если вы используете jq, вы можете сделать что-то подобное

#!/bin/bash
json="$(js-yaml your-yaml-file.yml)"
aproperty="$(jq '.apropery' <<< "$json")"
echo "$aproperty"

Потому чтоjs-yaml преобразует файл yaml в строковый литерал json.Затем вы можете использовать эту строку с любым парсером json в вашей системе Unix.

0 голосов
/ 17 июля 2019

Если вам нужно одно значение, вы можете использовать инструмент, который преобразует ваш документ YAML в JSON и подает в jq, например yq.

Содержание sample.yaml:

---
bob:
  item1:
    cats: bananas
  item2:
    cats: apples
  thing:
    cats: oranges

Пример:

$ yq -r '.bob["thing"]["cats"]' sample.yaml 
oranges
0 голосов
/ 29 сентября 2015

Вы также можете использовать Grunt (JavaScript Task Runner).Может быть легко интегрирован с оболочкой.Он поддерживает чтение файлов YAML (grunt.file.readYAML) и JSON (grunt.file.readJSON).

Этого можно достичь, создав задачу в Gruntfile.js (или Gruntfile.coffee), например:

module.exports = function (grunt) {

    grunt.registerTask('foo', ['load_yml']);

    grunt.registerTask('load_yml', function () {
        var data = grunt.file.readYAML('foo.yml');
        Object.keys(data).forEach(function (g) {
          // ... switch (g) { case 'my_key':
        });
    });

};

затем из оболочки просто запустите grunt foo (проверьте grunt --help для доступных задач).

Более того, вы можете реализовать exec:foo задач (grunt-exec) с входными переменными, переданными из вашей задачи(foo: { cmd: 'echo bar <%= foo %>' }), чтобы напечатать вывод в любом формате, который вы хотите, а затем передать его в другую команду.


Существует также инструмент, похожий на Grunt, он называется gulp с дополнительным плагином gulp-yaml .

Установка через: npm install --save-dev gulp-yaml

Пример использования:

var yaml = require('gulp-yaml');

gulp.src('./src/*.yml')
  .pipe(yaml())
  .pipe(gulp.dest('./dist/'))

gulp.src('./src/*.yml')
  .pipe(yaml({ space: 2 }))
  .pipe(gulp.dest('./dist/'))

gulp.src('./src/*.yml')
  .pipe(yaml({ safe: true }))
  .pipe(gulp.dest('./dist/'))

Для дополнительных опцийразобраться с форматом YAML , проверьте сайт YAML на наличие доступных проектов, библиотек и других ресурсов, которые могут помочь вам разобрать этот формат.


Другие инструменты:

  • Jshon

    анализирует, считывает и создает JSON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...