Имея вход для переменной, динамически создавайте значения для другой переменной, используя список stati c - PullRequest
0 голосов
/ 05 января 2020

Имея вход для переменной, динамически создавать значения для другой переменной, используя stati c list

У меня есть набор имен хостов, я хотел бы назначить эти имена хостов переменная SERVERS или КЛИЕНТЫ. Когда имя хоста из данного списка выбрано для SERVERS, оно должно быть удалено из переменной CLIENTS.

Примечание: - переменная SERVER может иметь более одного имени хоста

LIST_OF_NODEScn01,cn02,cn03,cn04,cn05,cn06,cn07,cn08,cn09,cn10

INPUT = cn01

OUTPUT: -

SERVERS=cn01
CLIENTS=cn02,cn03,cn04,cn05,cn06,cn07,cn08,cn09,cn10
(echo "server $SERVERS"; echo "client $CLIENTS") > cn01.cmd

INPUT = cn02

ВЫХОД: -

SERVERS=cn02
CLIENTS=cn01,cn03,cn04,cn05,cn06,cn07,cn08,cn09,cn10
(echo "server $SERVERS"; echo "client $CLIENTS") > cn02.cmd

SERVERS=cn01,cn02
CLIENTS=cn03,cn04,cn05,cn06,cn07,cn08,cn09,cn10
(echo "server $SERVERS"; echo "client $CLIENTS") > cn01_cn02.cmd

ВХОД: - Значения для СЕРВЕРОВ, например

Если cn03, cn07 предоставляется в качестве входа, то

SERVERS=cn03,cn07
CLIENTS=cn01,cn02,cn04,cn05,cn06,cn08,cn09,cn10
(echo "server $SERVERS"; echo "client $CLIENTS") > cn03_cn07.cmd

Я попробовал следующее

for i in cn{01..10}; do 
   echo $i
   sed "s/$i//g" nodes.txt | sed 's/,,/,/g'| sed 's/,*$//g' | sed 's/^,//g' 
done

Ответы [ 2 ]

1 голос
/ 05 января 2020

Допущения:

  • nodes.txt содержит список всех возможных узлов, и изначально все узлы считаются «клиентскими» узлами
  • nodes.txt записи могут находиться на одном или больше строк, и если несколько узлов находятся в одной строке, они разделяются запятой (,)
  • входные данные для сценария представляют собой одно или несколько имен узлов, при этом несколько узлов разделяются запятой (, )

Пример nodes.txt содержимое:

$ cat nodes.txt
cn01,cn02,cn03,cn04,cn05,cn06,cn07,cn08,cn09,cn10
cn11,cn12

Мы рассмотрим решение awk для удаления узлов 'SERVER' из списка узлов 'CLIENT'. Мы начнем с загрузки всех узлов (nodes.txt) в массив clients[]. Для узлов сервера мы удалим узлы из массива clients[]. И, наконец, мы напечатаем то, что осталось в массиве clients[].

Пример сценария:

$ cat split_nodes 
SERVERS=${1}                                      # store out input node(s)

outfile=${SERVERS//,/_}.cmd                       # generate output file by replacing ',' with '_'
echo "output file: ${outfile}"

echo "server ${SERVERS}" > "${outfile}"           # dump our 'server' line to ${outfile}

awk '
BEGIN   { FS=RS="[,\n\r]" }                       # input field/record delimiter is "," or "\n" or "\r"

FNR==NR { clients[$1]=1; next}                    # FNR==NR => first file; use node names to populate associative array where index==node name
        { delete clients[$1] }                    # at this point we are processing 2nd file; delete (server) node from client[] array

END     { pfx="client "                           # first part of output is the string "client "
          n=asorti(clients,sorted)                # sort our client nodes by name
          for ( i=1; i<=n; i++ )                  # loop through list of indexes from the sorted array
              { printf "%s%s", pfx, sorted[i]     # print prefix and node name
                pfx=","                           # for array items 2+ change prefix to ","
              }
          printf "\n"                             # terminate output with a line feed
        }
' nodes.txt <(echo "${SERVERS}") >> "${outfile}"  # dump output to our new file

NOTE : <(echo "${SERVERS}") позволяет нам передавать содержимое переменной ${SERVERS} в сценарий awk в виде файла.

Запуск сценария с некоторыми другими входными параметрами

$ split_nodes cn01
output file: cn01.cmd

$ cat cn01.cmd
server cn01
client cn02,cn03,cn04,cn05,cn06,cn07,cn08,cn09,cn10,cn11,cn12

$ split_nodes cn03,cn07
output file: cn03_cn07.cmd

$ cat cn03_cn07.cmd
server cn03,cn07
client cn01,cn02,cn04,cn05,cn06,cn08,cn09,cn10,cn11,cn12

Сценарий может быть изменен достаточно хорошо принять во внимание различные форматы для ввода (например, включает ли входная «строка» какие-либо пробелы и т. д. c), но сейчас мы предположим, что пользователь предоставляет ввод, аналогичный тому, что указан в вопросе.

1 голос
/ 05 января 2020

Если я правильно понял ваше требование, не могли бы вы попробовать следующее.

cat script.ksh
echo "Enter cn values in form of cn01 or cn02 etc here...."
read value

SERVERS="$value"
LIST_OF_NODES="cn01,cn02,cn03,cn04,cn05,cn06,cn07,cn08,cn09,cn10"   

awk -v servers="$SERVERS" -v clients="$LIST_OF_NODES" '
BEGIN{
  s1=","
  split(servers,array,",")
  for(i in array){
    gsub(s1 array[i] s1,s1,clients)
    gsub("^"array[i] s1,"",clients)
    gsub(s1 array[i]"$","",clients)
  }
  gsub(/,/,"_",servers)
  print clients > servers".cmd"
}'

Созданный выше скрипт. Теперь, когда мы запускаем скрипт:

./file.ksh
Enter cn values in form of cn01 or cn02 etc here....
cn04,cn07

Будет создан выходной файл с именем cn04_cn07.cmd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...