Допущения:
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), но сейчас мы предположим, что пользователь предоставляет ввод, аналогичный тому, что указан в вопросе.