Альтернатива JQ для перебора массива JSON в оболочке - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть объект

items=$(aws dynamodb scan --attributes-to-get Zipcode Id --table-name Test --query "Items[*]" --output json | jq --compact-output '.[]')
for itemValue in $items; do
    aws dynamodb delete-item --table-name Test --key $itemValue
done

Он удаляет все элементы последовательно один за другим. Может кто-нибудь подсказать, пожалуйста, как можно добиться того же без использования jq. Так как на ec2 не разрешено быть сторонней командой? Можно ли это сделать с помощью команд aws -cli?

Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2020

Первоначальный код не работал в первую очередь

# THIS IS BROKEN
json_list='["First Item", "Second Item", "Third Item"]'
for itemValue in $(echo "$json_list" | jq --compact-output '.[]'); do
  echo "Got an item: <$itemValue>"
done

испускает:

Got an item: <"First>
Got an item: <Item">
Got an item: <"Second>
Got an item: <Item">
Got an item: <"Third>
Got an item: <Item">

Очевидно, это неверно: он разделен на пробелы, расширен на глобусы (a *, окруженный пробелом внутри строки, будет заменен списком имен файлов в текущем каталоге) и содержит буквальные кавычки, в которых вместо приведенных в JSON указаны syntacti c.


Правильное выполнение с jq Требуется лучший выбор разделителя, и A while read L oop

# THIS WORKS
json_list='["First Item", "Second Item", "Third Item"]'
while IFS= read -r -d '' itemValue; do
  echo "Got an item: <$itemValue>"
done < <(jq -j '.[] | (., "\u0000")' <<<"$json_list")

... с выходным сигналом:

Got an item: <First Item>
Got an item: <Second Item>
Got an item: <Third Item>

Тот же самый ответ может быть легко перенесен на Python

json_to_nullsep_py=$(cat <<'EOF'
import json
import sys
for item in json.load(sys.stdin):
    sys.stdout.write(item)
    sys.stdout.write('\x00')
EOF
)

json_to_nullsep() {
  python -c "$json_to_nullsep_py" "$@"
}

while IFS= read -r -d '' itemValue; do
  echo "Got an item: <$itemValue>"
done < <(json_to_nullsep <<<"$json_list")

... аналогично правильно выдает:

Got an item: <First Item>
Got an item: <Second Item>
Got an item: <Third Item>
...