Dividir arquivo por padrão

0

Existe uma maneira fácil de dividir, por exemplo, o arquivo apache vhost com vários vhosts em 1 vhost por arquivo?

Ou algo mais, permitindo operar apenas um por um vhost para obter a saída do grep.

solução preferida em bash.

    
por niktwazny 26.07.2016 / 19:40

2 respostas

3

Você pode dividir arquivos com base no conteúdo da linha com csplit . Este é um comando POSIX , mas o A versão GNU possui algumas extensões úteis. Com o GNU csplit (Linux não integrado, Cygwin), veja como dividir um arquivo em cada linha que começa com <VirtualHost :

csplit -f 'virtualhost-' -b '%03d.conf' all-sites.conf '/^ *<VirtualHost /' '{*}'

Portably, isso é mais desajeitado. Você precisa contar o número de ocorrências e os nomes dos arquivos de saída terminam com a seqüência de dígitos.

csplit -f 'virtualhost-' all-sites.conf '/^ *<VirtualHost /' "{$(($(grep -c '^ *<VirtualHost <all-sites.conf') - 1))}"

De qualquer forma, o primeiro arquivo contém tudo até a primeira linha <VirtualHost ; pode estar vazio. Se houver comentários antes de uma linha <VirtualHost , eles não serão anexados à seguinte seção <VirtualHost ; csplit não é inteligente o suficiente para fazer isso, muito menos descobrir se o comentário se aplica ao conteúdo anterior ou seguinte.

Se você quiser fazer algo mais sofisticado, como nomear os arquivos de saída após o conteúdo, você pode usar o awk. O utilitário csplit é conveniente às vezes, mas o awk pode fazer tudo o que pode fazer sem muita dificuldade.

awk '
  BEGIN {output_file = "preamble.conf"}
  /^ *<VirtualHost *[^ >]/ {
      output_file = "virtualhost-" sub(/ *[:>].*/, "", sub(/^ *<VirtualHost */, "", $0) ".conf";
  }
  {print >output_file}
' all-sites.conf
    
por 27.07.2016 / 00:39
1

Isso está funcionando aqui, mas não é perfeito:

#!/bin/bash


i=1
echo >vhost_${i}.conf
while IFS= read -r lin; do
        case $lin in 
        \<VirtualHost*\>)
                true
        ;;
        esac

        echo "$lin" >>vhost_${i}.conf 

        case $lin in 
        \</VirtualHost\>)
            i=$((i+1))
            echo >>vhost_${i}.conf
        ;;
        esac

done

Você precisa canalizar o conteúdo do arquivo para esse script assim:

cat thenicefile.conf | thisscript 

E você provavelmente terá vhosts numerados em thenicefile.conf!

    
por 26.07.2016 / 21:27