Puncte:0

sed: personalizarea antetului fișierului de configurare cu o lungime definită?

drapel us

Folosesc sed pentru a personaliza fișierele de configurare a containerului LXC de la gazda LXC. Asta funcționează bine până acum. La ajustarea antetelor de comentarii (nume de gazdă și dată), există probleme estetice cu lățimea antetelor, deoarece atunci când numele de gazdă cu lungimi diferite este înlocuit, lățimea totală a Heatherului nu este compensată automat la sfârșit.

în exemplul meu, șirul SERVER ar trebui înlocuit.

###########################
# Configurare RSYSLOG #
# SERVER:/etc/rsyslog.conf #
# t12@RMS 2020-03-23 ​​#
###########################
###########################
# Configurare RSYSLOG #
# gersrv:/etc/rsyslog.conf #
# t12@RMS 2020-04-23 #
###########################
###########################
# Configurare RSYSLOG #
# sv4:/etc/rsyslog.conf #
# t12@RMS 2020-06-23 #
###########################

Cum pot obține asta cu sed? Sau am nevoie de awk?

sed -i "s/SERVER/${servername}/g" /calea către container/etc/rsyslog.conf
Puncte:1
drapel in

Iată o soluție:

Folosesc lungimea primei linii ca referință la lungime.

#! /bin/bash

RSYSLOG_FILENAME="/etc/rsyslog.conf"

awk -v servername="$1" '
/^#+$/ {
    ndash = lungime ($0)
    imprimare
    Următorul
}
/^# SERVER:/ {
    str = "# " nume server ":/etc/rsyslog.conf"
    nspace = ndash - lungime (str) - 1
    dacă (nspațiu < 1) { nspațiu = 1 }
    printf("%s%*.*s#\n", str, nspace, nspace, "")
    Următorul
}
{
    imprimare
}
' "${RSYSLOG_FILENAME}" > "${RSYSLOG_FILENAME}.tmp"

mv „${RSYSLOG_FILENAME}.tmp” „${RSYSLOG_FILENAME}”

ACTUALIZAȚI

Pentru mai multe fișiere.

Fişier: ./sysconf.sh

#! /bin/bash

declara -r SERVER_NAME="$1"
schimb

pentru CONF_FILENAME în „${@}”; do
    awk -v servername="${SERVER_NAME}" '
    /^#+$/ {
        ndash = lungime ($0)
        imprimare
        Următorul
    }
    /^# SERVER:/ {
        potrivire($0, /[: ][^: #]*[ #]/, arr)
        fn = arr[0]
        gsub(/[: #]/, "", fn)
        str = "# " nume server ":" fn
        nspace = ndash - lungime (str) - 1
        dacă (nspațiu < 1) { nspațiu = 1 }
        printf("%s%*.*s#\n", str, nspace, nspace, "")
        Următorul
    }
    {
        imprimare
    }
    ' "${CONF_FILENAME}" > "${CONF_FILENAME}.tmp"
    mv „${CONF_FILENAME}.tmp” „${CONF_FILENAME}”
Terminat

Folosit asa:

./sysconf.sh sv4 /etc/rsyslog.conf /etc/mysql/mariadb.cnf
questor avatar
drapel us
multumesc, functioneaza bine. Dar un punct este deschis. Scriptul meu ar trebui să schimbe antetul fișierelor de configurare pentru diverse servicii în mai multe containere, nu numai rsyslog. înseamnă că /etc/rsyslog.conf este doar un exemplu și nu poate fi folosit ca șir static # SERVER:/etc/rsyslog.conf # # SERVER:/etc/mysql/mariadb.cnf # # SERVER:/etc/ldap/ldap.conf # în sed există \1 \2 instrucțiuni pentru a păstra un șir dacă se potrivește cu un filtru. nu sunt sigur dacă este nevoie de similar în awk.
Arnaud Valmary avatar
drapel in
Mi-am actualizat soluția pentru orice nume de fișier

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.