Use o primeiro número disponível de um arquivo

Use o primeiro número disponível de um arquivo

Eu tenho um arquivo de configuraçãoprosody.config

Com os seguintes dados:

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"

Preciso encontrar o primeiro número disponível após o node2.subdomain.domain.comnúmero, neste caso 3, e repeti-lo de volta para a mesma configuração, comoecho -e "Component \"node3.subdomain.domain.com\"\n component_secret = \"password\"" >> prosody.config

O conteúdo final deverá ficar assim:

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"

Cada vez que você executa o script, o número aumenta em um a partir do maior número neste caso"node4.subdomain.domain.com"

Obrigado !

Responder1

Curtoficar boquiabertosolução:

awk -v FPAT="[0-9]+" 'END{print "node"$1+1}' xyz.config

A saída:

node4

  • FPAT="[0-9]+"- uma regexp que corresponde aos campos, em vez de corresponder ao separador de campos

  • END{...}- considerando apenas a última linha do arquivo

Responder2

< xyz.config tail -n 1 | awk 'match($0, /[0-9]+$/) {
  print substr($0, 1, RSTART-1) substr($0, RSTART)+1}'

Para obter a última linha do arquivo, extraia os dígitos do final da linha, imprima o que precede os dígitos seguido do número que compõe esses dígitos incrementado em um.

Você também pode fazer tudo em awk, mas isso significa ler o arquivo inteiro:

< xyz.config awk 'END {if(match($0, /[0-9]+$/))
  print substr($0, 1, RSTART-1) substr($0, RSTART)+1}'

Usando shoperadores:

< xyz.config tail -n1 | (
  IFS= read -r line || exit
  num=${line##*[!0-9]}
  printf '%s\n' "${line%"$num"}$((num + 1))")

informação relacionada