Как разделить файл виртуального хоста (config) nginx на маленькие, используя оболочку - PullRequest
1 голос
/ 09 марта 2012

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

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

    }

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

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

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

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

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

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

$ for i in xx*; do mv $i `grep -oPm1 '(?<=server_name).+(?=;)' $i`; done
1 голос
/ 28 июля 2016

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

#!/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
1 голос
/ 11 марта 2012

Основываясь на ответе Кева, я написал модифицированный скрипт ниже.

    #!/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
...