Начинаю цикл статей с интересными задачками по Bash.
Задачка о том, как вырезать часть файла конфигурации apache.
Задача: Известно, что на сервере Apache2, который работает в CentOS v.6, настроено около 50 сайтов. Дальше опциональное условие: все они описаны минимум в трех конфигурационных файлах (их расположение не известно). Нужно написать Bash скрипт, который получит из трех конфигурационных файлов, настройки для 4-х сайтов и сохранит их в отдельные файлы или в один отдельный файл. Список сайтов:
  - website1.com
 
  - website2.net
 
  - website3.info
 
  - website4.org
 
Полагаю, что может быть два типа читателей:
  - Тот, кто ищет головоломку.
 
  - Тот, кто ищет решение.
 
Для второго типа читателей выкладываю дальнейший скрипт:
  Раскрой меня
    
# Объявляем список сайтов
sites=(website1.com website2.net website3.info website4.org);
# Создаем цикл проходки по списку сайтов
for website in $sites;
do
# Получаем информацию о конфиге, в котором описан хост
    config=$(apachectl -S 2>&1 |grep "80 namevhost $website" |cut -d "(" -f 2 |cut -d ":" -f1);
    if [[ $config != "" ]];
        then
        # Описание начала конфига
        start=$(apachectl -S 2>&1 |grep "80 namevhost $website" |cut -d ":" -f 2 |cut -d ")" -f 1);
        # Описание конца конфига
        eof=$(cat $config |wc -l)
        end=$(cat -n $config |sed -n "$start,$eof"p |grep "</Virtual.ost>" |sed -n '1p' |awk '{print $1}');
        # Вырезаем настройки хоста из конфига
        sed -n "$start","$end"p $config >> extracted_hosts.conf;
        echo "" >> extracted_hosts.conf;
     else
        echo "check $website";
     fi;
done
# Создаем цикл проходки по списку ssl сайтов
for website in $sites;
do
# Получаем информацию о конфиге, в котором описан хост
    config=$(apachectl -S 2>&1 |grep "443 namevhost $website" |cut -d "(" -f 2 |cut -d ":" -f1);
    if [[ $config != "" ]];
        then
        # Описание начала конфига
        start=$(apachectl -S 2>&1 |grep "443 namevhost $website" |cut -d ":" -f 2 |cut -d ")" -f 1);
        # Описание конца конфига
        eof=$(cat $config |wc -l)
        end=$(cat -n $config |sed -n "$start,$eof"p |grep "</Virtual.ost>" |sed -n '1p' |awk '{print $1}');
        # Вырезаем настройки хоста из конфига
        sed -n "$start","$end"p $config >> extracted_hosts.conf;
        echo "" >> extracted_ssl_hosts.conf;
     else
        echo "check $website";
     fi;
done
     
 
Если изменить имя файла extracted_host.conf на $website.conf, тогда конфиг каждого сайта будет сохранен в отдельный файл.