Как разбить файл виртуального хоста nginx (config) на небольшие, используя оболочку

У меня есть сервер nginx, и он имеет около 30 + виртуальный хост-блок в одном файле. Весь блок виртуального хоста выглядит следующим образом:

    server
       {
    #concrete configuration items
    server_name    myserver.hostname.com;
    #concrete configuration items
    #and so on....

    }

Мой вопрос в том, как я могу разделить каждый серверный блок на один файл с именем по значению server_name? например, указанный выше серверный блок сохраняет файл с именем myserver.hostname.com.conf Я хотел бы использовать код оболочки для выполнения этой задачи.

Кстати, я не уверен, что это хорошая идея, чтобы каждый виртуальный хост имел свой конфигурационный файл. Но я делал что-то как увеличение виртуального хоста, стало бесполезным, чтобы закрепить их в общем файле.

Ответ 1

Вы можете использовать команду csplit для разделения файла по контексту:

$ csplit input.conf '/^\s*server\s*$/' {*}

Затем mv (переименовать) эти файлы в server_name из содержимого:

$ for i in xx*; do mv $i `grep -oPm1 '(?<=server_name).+(?=;)' $i`; done

Ответ 2

На основании ответа Kev я написал измененный script ниже.

    #!/bin/bash
    rm xx*
    csplit port80 '/\s*\<server\>\s*/' {*}
    #new_name =''
    for i in xx*
    do
        if grep -oP '(?<=server_name).+;' $i
        then
            result=`grep -oP '(?<=server_name).+;' $i`
            new_name=`echo $result|awk '{print $1}'`
            new_name=${new_name%';'}
            mv $i $new_name
        else
            rm $i
        fi
    done

Ответ 3

Этот script разделит входной файл на более мелкие:

#!/bin/bash
if [ "$1" == "" ]; then
  echo "USAGE: $0 [filename]"
  exit;
fi
# rm xx* *.conf'; # uncomment to re-un
csplit "$1" '/^\s*server\s*{*$/' {*}
for i in xx*; do
  new=$(grep -oPm1 '(?<=server_name).+(?=;)' $i|sed -e 's/\(\w\) /\1_/g'|xargs);
  if [[ -e $new.conf ]] ; then
    cat "$i">>$new.conf
    rm "$i"
  else
    mv "$i" $new.conf
  fi
done