Como reformatar os blocos de zonas do named.conf em linhas simples?

2

Por razões que eu não vou entrar aqui, eu preciso fazer uma cópia do arquivo named.conf do servidor antigo do CentOS 5.10 e executar alguma manipulação de texto na cópia. O resultado final deve consolidar as informações de cada zona em uma única linha separada. Além disso, eu preciso script para que ele possa ser executado como um cron job. Veja um exemplo do que estou começando:

zone "." {
        type hint;
        file "named.root";
};

zone "somedomain.com" {
        type master;
        file "somedomain.net";
        allow-transfer {
                11.11.11.11;
                22.22.22.22;
                common-allow-transfer;
        };
};

zone "otherdomain.com" {
        type master;
        file "otherdomain.com";
        allow-transfer {
                33.33.33.33;
                44.44.44.44;
                55.55.55.55;
                common-allow-transfer;
        };
};

E aqui está um exemplo do que deve aparecer no arquivo editado:

zone "." { type hint; file "named.root"; };
zone "somedomain.com" { type master; file "somedomain.net"; allow-transfer { 11.11.11.11; 22.22.22.22; common-allow-transfer; }; };
zone "otherdomain.com" { type master; file "otherdomain.com"; allow-transfer { 33.33.33.33; 44.44.44.44; 55.55.55.55; common-allow-transfer; }; };

Meu CIO e eu procuramos, sem sucesso, os scripts existentes que convertem o named.conf em um formato de uma linha por zona. Usando tr e sed, consegui 1) transformar todas as guias em espaços e 2) compactar vários espaços contíguos em um único espaço. O resultado está mais próximo do que preciso, mas ainda estou tendo problemas para excluir novas linhas indesejadas, mantendo as novas linhas desejadas. Aqui está a saída de exemplo que está perto de estar correta:

zone "." {
 type hint;
 file "named.root"; 
};
zone "somedomain.com" {
 type master;
 file "somedomain.net";
 allow-transfer {
 11.11.11.11;
 22.22.22.22;
 common-allow-transfer;
 };
};
zone "otherdomain.com" {
 type master;
 file "otherdomain.com";
 allow-transfer {
 33.33.33.33;
 44.44.44.44;
 55.55.55.55;
 common-allow-transfer;
 };
};

Testei algumas expressões sed, awk e tr sugeridas para resolver o problema da nova linha, mas nenhuma das expressões forneceu a saída desejada. Qualquer sugestão que você tenha - até mesmo uma direção geral como "experimente com sed e x, y, z" - seria muito apreciada. Obrigado!

    
por keyop 22.08.2018 / 17:59

4 respostas

4

Abra o arquivo no Vim (ou apenas vi ) e digite:

:g/^zone/.,/^}/j

Voila, você terminou.

Isso executa g lobally, em todas as linhas que começam com zone , o comando:

.,/^}/j

O que significa que, da linha atual ( . ) até a próxima linha que começa com uma chave de fechamento, j oin todas essas linhas juntas.

Se você precisar fazer o script, use o formato de script de vi , ex :

printf '%s\n' 'g/^zone/.,/^}/j' x | ex file.txt
    
por 22.08.2018 / 18:12
1

Tente isto:

sed -n '
    /^zone/,/^};/ H          # append current line to hold space in this range
    /^};/ {                  # at the end of the range:
        s/.*//               #   erase the current line
        x                    #   exchange pattern space with hold space
        s/\n//               #   remove first newline (before "zone")
        s/[[:space:]]\+/ /g  #   condense all other whitespace including newlines
        p                    #   and print this zone record
    }
' named.conf 

resultado

zone "." { type hint; file "named.root"; };
zone "somedomain.com" { type master; file "somedomain.net"; allow-transfer { 11.11.11.11; 22.22.22.22; common-allow-transfer; }; };
zone "otherdomain.com" { type master; file "otherdomain.com"; allow-transfer { 33.33.33.33; 44.44.44.44; 55.55.55.55; common-allow-transfer; }; };
    
por 22.08.2018 / 18:31
0

sed -e ':nextline' -e N -e 's/\n\s*\([^z]\)//' -e 'tnextline' named.conf

    
por 22.08.2018 / 18:14
0

Você poderia fazer isso usando as ferramentas paragraph-mode de awk e Perl e o operador de intervalo , da ferramenta sed :

sed -e '
    /^zone/,/^$/!d
    H;/^zone/h;/^$/!{$!d;}
    g;s/[[:space:]]\{1,\}/ /g
    s/ $//
' input.file

awk -vRS= '{$1=$1}1' input.file

perl -pl -00e 's/\s+/ /g' input.file

perl -pl -00e 'tr/\t0\n/ /s' input.file

Saída:

zone "." { type hint; file "named.root"; };
zone "somedomain.com" { type master; file "somedomain.net"; allow-transfer { 11.11.11.11; 22.22.22.22; common-allow-transfer; }; };
zone "otherdomain.com" { type master; file "otherdomain.com"; allow-transfer { 33.33.33.33; 44.44.44.44; 55.55.55.55; common-allow-transfer; }; };
    
por 23.08.2018 / 06:30