Мне нужно запросить файл jason, чтобы получить значение service_name, затем взять значение, удалить двойные кавычки, преобразовать пробелы в тире, а затем в верхний и нижний регистр.
Вот мое производство jsonфайл .json
{
"port": 5000,
"machine": "102",
"ip": "xxx.xxx.xxx.xxx",
"drum_id": "1305145216186552",
"client": {
"service_name": "Two Men And A Truck",
"vendor": "default"
}
}
и это моя команда
jq '"\(.client.service_name)"' /home/systems/clients/000002/production.json | sed 's/"//g;s/ /-/g;s/\(.*\)/\L\1/'
, и это прекрасно работает.
root@0200 ~ # cat /home/systems/clients/000002/production.json
{
"port": 5000,
"machine": "102",
"ip": "xxx.xxx.xxx.xxx",
"drum_id": "1305145216186552",
"client": {
"service_name": "Two Men And A Truck",
"vendor": "default"
}
}
root@0200 ~ # jq '"\(.client.service_name)"' /home/systems/clients/000002/production.json | sed 's/"//g;s/ /-/g;s/\(.*\)/\L\1/'
two-men-and-a-truck
Теперь вотмой начальный сценарий.Это все идет по vlan atm, и я в конце концов прогоню его через туннель ssh.
#!/bin/bash
#
#-- tmp files
tmp_dir="$(mktemp -d -t 'text.XXXXX' || mktemp -d 2>/dev/null)"
tmp_input1="${tmp_dir}/temp_input1.txt"
tmp_input2="${tmp_dir}/temp_input2.txt"
tmp_input3="${tmp_dir}/temp_input3.txt"
#- servers
cbservers=( "xxx.xxx.xxx.xxx" "xxx.xxx.xxx.xxx" )
for cbserver in "${cbservers[*]}"; do
ssh user@"$cbserver" "ls /home/systems/clients | grep '^[0-9]'" > "$tmp_input1"
while read client; do
ssh user@"$cbserver" "jq '"\(.client.service_name)"' /home/systems/clients/000002/production.json | sed 's/"//g;s/ /-/g;s/\(.*\)/\L\1/'" > "$tmp_input3"
done<"$tmp_input1"
done
rm -rf "$tmp_dir"
У меня чертовски много времени пытается обернуть команду, отправляемую по ssh.
ssh user@"$cbserver" "jq '"\(.client.service_name)"' /home/systems/clients/000002/production.json | sed 's/"//g;s/ /-/g;s/\(.*\)/\L\1/'" > "$tmp_input3"
Если есть более простой способ сделать это, пожалуйста, просветите меня.
Обновление
Я следовал всем советам ниже
#!/bin/bash
#
#-- tmp files
tmp_dir="$(mktemp -d -t 'text.XXXXX' || mktemp -d 2>/dev/null)"
tmp_input1="${tmp_dir}/temp_input1.txt"
tmp_input2="${tmp_dir}/temp_input2.txt"
#- servers
cbservers=( "xxx.xxx.xxx.xxx" "xxx.xxx.xxx.xxx" )
for cbserver in "${cbservers[*]}"; do
ssh user@"$cbserver" "ls /home/systems/clients | grep '^[0-9]'" > "$tmp_input1"
while read client; do
file="/home/systems/clients/${client}/production.json "
ssh user@"$cbserver" jq --raw-output '.client.service_name' "$file" | sed 's/ /-/g;s/\(.*\)/\L\1/' > "$tmp_input2"
done<"$tmp_input1"
done
rm -rf "$tmp_dir"
цикл «while read client» запускается только один раз и должен выполняться 12 раз.