LINUX.ORG.RU

Нужна помощь с bash-скриптом.

 , ,


2

1

Есть такой скрипт:

#!/bin/bash
  
file="test1.txt"

cat<<EOF>$file
rabbit1-test1
rabbit1-test2
rabbit1-test3
EOF


cat $file | while read line; do jq -Rs \
   --arg v1 "/"              \
   --arg v2 "$line"          \
   --arg v3 "rabbit@node1" \
   '{"{#VHOSTNAME}" : $v1, "{#QUEUENAME}": $v2, "{#NODENAME}": $v3}' \
   <<<'{}' ;
done

Нужно получить такой результат:

{
  "data": [
    {
      "{#VHOSTNAME}": "/",
      "{#QUEUENAME}": "rabbit1-test1",
      "{#NODENAME}": "rabbit@node1"
    },
    {
      "{#VHOSTNAME}": "/",
      "{#QUEUENAME}": "rabbit1-test2",
      "{#NODENAME}": "rabbit@node1"
    },
    {
      "{#VHOSTNAME}": "/",
      "{#QUEUENAME}": "rabbit1-test3",
      "{#NODENAME}": "rabbit@node1"
    }
  ]
}

Как правильно добавить

"data": [
в эту строчку?
'{"{#VHOSTNAME}" : $v1, "{#QUEUENAME}": $v2, "{#NODENAME}": $v3}'

Перед cat добавь echo "{\"data\":["
После done добавь echo "]}"


Но, у тебя там в другом проблема.
У тебя после каждого блока {} (кроме последнего) нет запятой.
Вот с ней придётся помудрить куда сильнее.
PS: долбаные кавычки

imul ★★★★★
()
Последнее исправление: imul (всего исправлений: 1)

Что за формат на выходе? json или что? От этого и пляши.

anonymous
()
Ответ на: комментарий от imul

Вот с ней придётся помудрить куда сильнее.

Это если jq юзать нельзя. Если это не дурацкий экзамен, а реальный скрипт, то наверняка — можно.

PS: долбаные кавычки

Ну так можно же и удобнее:

echo '{"data":['

vodz ★★★★★
()
printf "\n   \"data\" : ["

LLD Zabbix делает больно да :)

sniper21 ★★★★★
()
Последнее исправление: sniper21 (всего исправлений: 2)
Ответ на: комментарий от vodz

Ну так можно же и удобнее:

Я не про кавычки в скрипте, а про кавычки на форуме.

imul ★★★★★
()
Ответ на: комментарий от vodz

Это если jq юзать нельзя.

Если посмотреть в сам скрипт ТС то очевидно что можно. И даже используется. Тем не менее, запятые для ТС прошли мимо.

imul ★★★★★
()
QUEUENAMES=(
rabbit1-test1
rabbit1-test2
rabbit1-test3
)

for q in "${QUEUENAMES[@]}"; do
        Q+=${Q:+,}\"$q\"
done

jq '.[] as $q | { "data":
{"{#VHOSTNAME}": "/", "{#QUEUENAME}": $q, "{#NODENAME}": "rabbit@node1" } }' <<< "[$Q]"
vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от imul

Если посмотреть в сам скрипт ТС то очевидно что можно.

Я выше написал готовый скрипт.

Тем не менее, запятые для ТС прошли мимо.

Не вижу у него каких-то отступлений от синтаксиса json.

Я не про кавычки в скрипте, а про кавычки на форуме.

В [ code ], который не маркдаун — нормально :)) Вот парсер bash-а так себе, разукрасило чёрт знает как.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от vodz

Я выше написал готовый скрипт.

Нужно получить такой результат:

получен не такой

Не вижу у него каких-то отступлений от синтаксиса json.

В образце? Там всё нормально. И валидацию на https://jsonlint.com/ образец проходит.
В выхлопе его скрипта — нет, не нормально. Там нужны запятые.
Образец дан? Надо следовать. Вдруг действительно лабораторка.

imul ★★★★★
()
Ответ на: комментарий от imul

Не лабораторка, а как выше написали LLD Zabbix.

perrfect
() автор топика
Ответ на: комментарий от imul

В образце? Там всё нормально. Надо следовать.

Вот по образцу, то есть по нормальному синтаксису и сделал. Если его бы скрипт устраивал, то наверное и вопроса не было? По крайней мере я понял так.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от perrfect

С этими скобочками немудрено. Поправил.

QUEUENAMES=(
rabbit1-test1
rabbit1-test2
rabbit1-test3
)

for q in "${QUEUENAMES[@]}"; do
        Q+=${Q:+,}\"$q\"
done

jq '{data: [ { "{#VHOSTNAME}": "/", "{#QUEUENAME}": .[], "{#NODENAME}": "rabbit@node1" } ] }
' <<< "[$Q]"

vodz ★★★★★
()

ИТТ люди не умеющие в jq.

cat file | jq -Rn \
    --arg v1 / \
    --arg v3 rabbit@node1 \
    '[inputs] | map({"{#VHOSTNAME}" : $v1, "{#QUEUENAME}": ., "{#NODENAME}": $v3})'
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 4)
Ответ на: комментарий от intelfx

ИТТ люди не умеющие в jq.

И в Shell.

jq -Rn --arg v1 / --arg v3 rabbit@node1 \
    '[inputs] | map({"{#VHOSTNAME}" : $v1, "{#QUEUENAME}": ., "{#NODENAME}": $v3})' < file
anonymous
()
Ответ на: комментарий от anonymous

И в Shell.

И почему-то никак не могут без -Rn. Нашли чем гордиться, блин. Кстати, результат таки далёк от требуемого.

vodz ★★★★★
()
Ответ на: комментарий от anonymous

Я не вижу ничего плохого в cat |. Такая запись легче читается и легче пишется с минимальной потерей эффективности — тебя разве не учили, что за редкими исключениями программы пишутся в первую очередь для людей, а уже потом для компьютеров?

intelfx ★★★★★
()
Ответ на: комментарий от vodz

И почему-то никак не могут без -Rn. Нашли чем гордиться, блин

А ты, я так понимаю, гордишься неиспользованием этих флагов? Нашёл чем гордиться[2].

Кстати, результат таки далёк от требуемого.

Да, я забыл дописать | { "data": . }. Не важно, я привёл основную часть решения.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Я не вижу ничего плохого в cat |. Такая запись легче читается и легче пишется с минимальной потерей эффективности — тебя разве не учили, что за редкими исключениями программы пишутся в первую очередь для людей, а уже потом для компьютеров?

Что за чушь вы несёте? cat | делает два процесса, отдельных, основной скрипт может получить результат только из вывода. Данный способ хорош для много чего, но только не cat, ибо это просто идиотизм, а не читабельность.

vodz ★★★★★
()
Ответ на: комментарий от vodz

cat | делает два процесса, отдельных

И что?

основной скрипт может получить результат только из вывода

Что за чушь ты несёшь?

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

А ты, я так понимаю, гордишься неиспользованием этих флагов? Нашёл чем гордиться

Конечно. Ибо это очень узкие знания, мало помогающие для общей эрудиции, скажем для jsonlib-based программ, где json юзается во всю, но монстра jq нет вовсе, скажем в OpenWRT. Особенно смешно, что в качестве альтернативы предлагается юзать временный файл! Ну офигеть не встать.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от intelfx

Что за чушь ты несёшь?

Для незнающих shell — объясняю. Код prg | while read rezult работает только внутри этого while. Как только while, то есть второй процесс пайпа заканчивается, так сразу rezult теряется.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Конечно. Ибо это очень узкие знания, мало помогающие для общей эрудиции, скажем для jsonlib-based программ

Вот именно, что умение пользоваться какими-то убогими библиотеками, в которых нельзя даже считать входной файл как массив строк — это очень узкие знания, мало помогающие для общей эрудиции ;)

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от vodz

Выдумал какую-то постороннюю ситуацию и давай ей размахивать. Где ты здесь видишь | while read result? Здесь только | jq. А ему, я тебя уверяю, абсолютно до лампочки, в сабшелле он запускается или нет.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от vodz

Кстати, результат таки далёк от требуемого.

echo -en «{\„data\“:$(jq -Rnc --arg v1 / --arg v3 rabbit@node1 '[inputs] | map({»{#VHOSTNAME}" : $v1, «{#QUEUENAME}»: ., «{#NODENAME}»: $v3})' < $file)}"
Без гордости, пробелов и переносов. Заббиксу всё-равно. PS: intelfx спасибо (прочитал всю тему).

imul ★★★★★
()
Последнее исправление: imul (всего исправлений: 2)
Ответ на: комментарий от intelfx

Выдумал какую-то постороннюю ситуацию и давай ей размахивать.

Чо? Не надо врать и вилять. Сейчас обсуждалось ваша выдумка, что «cat |» всегда удобно.

vodz ★★★★★
()
Ответ на: комментарий от intelfx

это очень узкие знания

Увы, у вас с логикой совсем туго. Имелся скрипт, который вы заюзали для того, чтобы сделать временный файл на ровном месте, вместо того, чтобы универсальным средством, который в системе применяется для много чего, сделать простую работу для формирования входных данных для универсальных средств обработки.

vodz ★★★★★
()
Ответ на: комментарий от vodz

всегда

Вот это ты сейчас сам выдумал. Я отвечал анонимусу, применительно к обсуждаемой проблеме, и только к ней.

В любом случае, да, удобно. Но не всегда применимо. Иногда приходится прибегать к менее удобным синтаксическим средствам. Где противоречие-то?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от vodz

это из «ТЗ» файл

file=«test1.txt»
cat<<EOF>$file
rabbit1-test1
rabbit1-test2
rabbit1-test3
EOF

imul ★★★★★
()
Ответ на: комментарий от vodz

По-моему, это у тебя туго — даже не знаю с чем, может с логикой, может со знаниями, а может тебе просто неохота признавать, что ты хрень несёшь уже полтреда, цепляясь по очереди за всё подряд. Какой к чёрту временный файл?

intelfx ★★★★★
()
Ответ на: комментарий от imul

Без гордости, пробелов и переносов. Заббиксу всё-равно.

Вы похоже о чём-то своём и совсем не в касcу. Пробелы и переносы вставлены специально, для человекочитабельности и демонстрационного вывода.

vodz ★★★★★
()
Ответ на: комментарий от vodz

А я их (пробелы и переносы) специально убрал. Потому что они нужны только для отладки генерации.

Вы похоже о чём-то своём и совсем не в касcу.

Мне ваша касса по барабану.

imul ★★★★★
()
Ответ на: комментарий от intelfx

цепляясь по очереди за всё подряд.

Если вы не заметили, я вообще с вами беседу не начинал. Это у вас заиграло в одном месте и открылся поток бреда. Начиная с первого же коммента в теме.

Это не мои проблемы. Я дал удовлетворивший ТСа результат, нет надо ж было прийти и попытаться всех обосрать и теперь ещё возмущаться, что вам отвечают на ваш высер. А как не получается, так завести стандартную детсадовскую шарманку: «может с логикой, может со знаниями, а может тебе просто неохота признавать».

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от imul

А я их (пробелы и переносы) специально убрал.

Да на здоровье. Но вы же мне зачем-то ответили, присовокупив ещё какую-то там гордость. Вот и нехрен возмущаться ответом.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Если вы не заметили, я вообще с вами беседу не начинал

Вот и не начинал бы.

Это у вас заиграло в одном месте и открылся поток бреда. Начиная с первого же коммента в теме.

«Бред» в студию.

Это не мои проблемы. Я дал удовлетворивший ТСа результат, нет надо ж было прийти

Это тоже не мои проблемы, что кто-то до меня дал какой-то там результат. У участников форума нет монополии на ответы в тредах.

и попытаться всех обосрать и теперь ещё возмущаться, что вам отвечают на ваш высер. А как не получается, так завести стандартную детсадовскую шарманку

Ты бы лучше хамил поменьше.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от vodz

присовокупив ещё какую-то там гордость.

Там на что я отвечал было следующее:

И почему-то никак не могут без -Rn. Нашли чем гордиться, блин.

Я же не обошёлся. Соответственно гордиться нечем. Поэтому и без гордости и заодно без пробелов с переносами.

Вот и нехрен возмущаться ответом.

Жупелы они такие, да.

На этом прощаюсь. Задача решена всеми возможными способами. Перепалка мне не интересна.

imul ★★★★★
()
Последнее исправление: imul (всего исправлений: 1)
Ответ на: комментарий от intelfx

Ты бы лучше хамил поменьше.

Вы и в правду не расцениваете свои первые же слова в этом треде как хамство? Может вы просто быдло и тогда разговаривать бессмысленно?

vodz ★★★★★
()
Ответ на: комментарий от vodz

Нет, потому что сказать человеку X, что он не умеет пользоваться инструментом Y (особенно если приведена демонстрация обратного) — это не хамство. Хотя я даже не адресовал это кому-то конкретному, а у тебя всё равно подгорело.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от legolegs

Знаю, пробовал — всё равно неудобно. Т. к. между «файлом» и «командой» нет никакого разделителя, при чтении они сливаются в одно.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Нет, потому что сказать человеку X, что он не умеет пользоваться инструментом Y

Вы это сказали всем, написав ТСу, я отвечал анониму, что некоторые даже не понимают свой бред по поводу умения пользоваться shell-ами, а подгорело как раз у вас.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.