grep/print значение ключа в json, которое хранится в переменной

У вас должно получиться что-то вроде:

menuentry 'Debian' --class debian --class gnu-linux --class gnu --class os {
  load_video
  set gfxpayload=keep
  insmod gzio
  insmod ext2
  insmod fat
  echo  'Loading Linux...'
  linux /boot/vmlinuz-3.16.0-4-amd64 cryptdevice=UUID=ffe7a64d-e552-4db9-b0f3-1e42be118059:cryptolvm root=/dev/Outsider-vg/Outsider-debianroot rw
  echo  'Loading initial ramdisk...'
  initrd /boot/initrd.img-3.16.0-4-amd64
}

Но учтите, что insmod part_gptуже должен быть добавлен в ваш grub.cfg. lvmи luksне нужны, потому что с этим справится ядро ​​(вам нужны соответствующие хуки ядра ), grub загружает только образ linux.

4
08.07.2020, 15:27
2 ответа

Вы также можете рассмотреть возможность установки gron, которая представляет собой утилиту для «Сделки JSON greppable!».

С a, определенным как в вашем вопросе,

echo $a | gron

возвращает

json.data = [];
json.data[0] = {};
json.data[0].coordinates = [];
json.data[0].coordinates[0] = {};
json.data[0].coordinates[0].dates = [];
json.data[0].coordinates[0].dates[0] = {};
json.data[0].coordinates[0].dates[0].date = "2020-07-08T15:53:23Z";
json.data[0].coordinates[0].dates[0].value = 25.1;
json.data[0].coordinates[0].lat = 39.23054;
json.data[0].coordinates[0].lon = 9.11917;
json.data[0].parameter = "t_2m:C";
json.dateGenerated = "2020-07-08T11:53:23Z";
json.status = "OK";
json.user = "unknown_unknown";
json.version = "3.0";

что действительно облегчает обработку:

$ echo $a | gron | sed -n '/value/{s/.* //; s/;//; p;}'
25.1

$ echo $a | gron | awk '/value/ {sub(/;/,""); print $NF;}'
25.1
9
18.03.2021, 23:21

Использование Miller с выравниванием массива JSON по умолчанию:

$ mlr --ijson --onidx cut -f 'data:0:coordinates:0:dates:0:value' <<<"$a"
25.1

или регулярное выражение -, соответствующее сглаженному имени элемента

$ mlr --ijson --onidx cut -r -f 'value$' <<<"$a"
25.1
5
18.03.2021, 23:21

Теги

Похожие вопросы