Как разбить файл виртуального хоста 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