Задать вопрос
@perrfect

Как правильно использовать команду printf bash?

Нужна помощь с printf bash.

Есть такой скрипт:
#!/bin/bash
  
VHOSTNAME=/
NODENAME=rabbit1

template='{"{#VHOSTNAME}": "%s", "{#QUEUENAME}": "%s", "{#NODENAME}": "%s"}, '

cat test.txt | while read LINE; do printf  "$template\n" "$VHOSTNAME" "$LINE" "$NODENAME";done


Содержимое файла test.txt:
rabbit1-test1
rabbit1-test2
rabbit1-test3


Вывод будет:
{"{#VHOSTNAME}": "/", "{#QUEUENAME}": "rabbit1-test1", "{#NODENAME}": "rabbit1"}, 
{"{#VHOSTNAME}": "/", "{#QUEUENAME}": "rabbit1-test2", "{#NODENAME}": "rabbit1"}, 
{"{#VHOSTNAME}": "/", "{#QUEUENAME}": "rabbit1-test3", "{#NODENAME}": "rabbit1"},


Как можно в начало вывода добавить вот такой текст:
{"data": [

Чтобы получилось вот так:
{"data": [
{"{#VHOSTNAME}": "/", "{#QUEUENAME}": "rabbit1-test1", "{#NODENAME}": "rabbit1"}, 
{"{#VHOSTNAME}": "/", "{#QUEUENAME}": "rabbit1-test2", "{#NODENAME}": "rabbit1"}, 
{"{#VHOSTNAME}": "/", "{#QUEUENAME}": "rabbit1-test3", "{#NODENAME}": "rabbit1"},
  • Вопрос задан
  • 173 просмотра
Подписаться Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 1
вот пример шел скрипта создающего из csv метрик типа json требуемой структуры
DATAFILE1="/tmp/data1.$$"
# NOTE:  do not use | as a separator
cat<<EOF>$DATAFILE1
first:11:second:12:third:13
first:22:second:22:third:23
first:32:second:32:third:33
EOF

1>&2 echo 'Loading:'
1>&2 cat $DATAFILE1
1>&2 echo '---'

DATAFILE2="/tmp/data2.$$"
DATAFILE2="/tmp/data.tmp.json"

IFS=':'; cat $DATAFILE1| while read KEY1 VALUE1 KEY2 VALUE2 KEY3 VALUE3; do
jq --arg k1 "$KEY1"   \
   --arg v1 "$VALUE1" \
   --arg k2 "$KEY2"   \
   --arg v2 "$VALUE2" \
   --arg k3 "$KEY3"   \
   --arg v3 "$VALUE3" \
   '. | .[$k1]=$v1 | .[$k2]=$v2 | .[$k3]=$v3'  \
   <<<'{}' ;
done > $DATAFILE2
DATA_KEY='data'
# making the rowset keyed by $DATA_KEY
# TODO: explore alternatives
cat $DATAFILE2 | jq --slurp '.' | jq "{\"$DATA_KEY\": .}"

запускаем
это дает

Loading:
first:11:second:12:third:13
first:22:second:22:third:23
first:32:second:32:third:33
---

{
  "data": [
    {
      "first": "11",
      "second": "12",
      "third": "13"
    },
    {
      "first": "22",
      "second": "22",
      "third": "23"
    },
    {
      "first": "32",
      "second": "32",
      "third": "33"
    }
  ]
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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