
У меня есть файл конфигурацииprosody.config
Имеются следующие данные:
VirtualHost "pubsub.subdomain.domain.com"
admins = { "node1.subdomain.domain.com", "node2.subdomain.domain.com" }
autocreate_on_subscribe = true
autocreate_on_publish = true
modules_enabled = {
"pubsub";
}
VirtualHost "subdomain.domain.com"
authentication = "anonymous"
modules_enabled = {
"bosh";
}
c2s_require_encryption = false
VirtualHost "auth.subdomain.domain.com"
authentication = "internal_plain"
admins = { "[email protected]" }
Component "node1.subdomain.domain.com"
component_secret = "password"
Component "node2.subdomain.domain.com"
component_secret = "password"
Component "conference.subdomain.domain.com" "muc"
Component "focus.subdomain.domain.com"
component_secret = "password"
Мне нужно найти первый доступный номер после node2.subdomain.domain.com
номера в этом случае 3
и вернуть его обратно в ту же конфигурацию, напримерecho -e "Component \"node3.subdomain.domain.com\"\n component_secret = \"password\"" >> prosody.config
Окончательный контент должен выглядеть так:
VirtualHost "pubsub.subdomain.domain.com"
admins = { "node1.subdomain.domain.com", "node2.subdomain.domain.com" }
autocreate_on_subscribe = true
autocreate_on_publish = true
modules_enabled = {
"pubsub";
}
VirtualHost "subdomain.domain.com"
authentication = "anonymous"
modules_enabled = {
"bosh";
}
c2s_require_encryption = false
VirtualHost "auth.subdomain.domain.com"
authentication = "internal_plain"
admins = { "[email protected]" }
Component "node1.subdomain.domain.com"
component_secret = "password"
Component "node2.subdomain.domain.com"
component_secret = "password"
Component "conference.subdomain.domain.com" "muc"
Component "focus.subdomain.domain.com"
component_secret = "password"
Component "node3.subdomain.domain.com"
component_secret = "password"
Component "node4.subdomain.domain.com"
component_secret = "password"
Каждый раз, когда вы запускаете скрипт, число увеличивается на единицу от самого большого числа в этом случае."node4.subdomain.domain.com"
Спасибо !
решение1
Короткийтаращитьсярешение:
awk -v FPAT="[0-9]+" 'END{print "node"$1+1}' xyz.config
Выход:
node4
FPAT="[0-9]+"
- регулярное выражение, которое соответствует полям, а не разделителю полейEND{...}
- учитывая только последнюю строку файла
решение2
< xyz.config tail -n 1 | awk 'match($0, /[0-9]+$/) {
print substr($0, 1, RSTART-1) substr($0, RSTART)+1}'
Чтобы получить последнюю строку файла, извлеките цифры из конца строки, выведите то, что предшествует цифрам, а затем число, составляющее эти цифры, увеличенное на единицу.
Вы также можете сделать все это в awk
, но это означает, что вам придется прочитать весь файл полностью:
< xyz.config awk 'END {if(match($0, /[0-9]+$/))
print substr($0, 1, RSTART-1) substr($0, RSTART)+1}'
Использование sh
операторов:
< xyz.config tail -n1 | (
IFS= read -r line || exit
num=${line##*[!0-9]}
printf '%s\n' "${line%"$num"}$((num + 1))")