Получение значения из файла json с удаленного сервера, а затем использование sed для замены заглавных букв, двойных кавычек и пробелов - PullRequest
0 голосов
/ 25 сентября 2018

Мне нужно запросить файл 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 раз.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы можете сделать все это в самой jq:

$ jq -r '.client.service_name | ascii_downcase | split(" ") | join("-")' <<EOF
{
    "port": 5000,
    "machine": "102",
    "ip": "xxx.xxx.xxx.xxx",
    "drum_id": "1305145216186552",
    "client": {
        "service_name": "Two Men And A Truck",
        "vendor": "default"
    }
}
EOF
two-men-and-a-truck
0 голосов
/ 25 сентября 2018

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

file=/home/systems/clients/000002/production.json
...
ssh user@"$cbserver" jq -r '.client.service_name' "$file" | perl -lnE 's/\s+/-/g; say lc' > "$tmp_input3"

Примечания:

  • Команда perl будет выполняться в вашей локальной системе.
  • Я использую jq -r, чтобы избежать кавычек.
...