извлечение виртуальных хостов в отдельные файлы на основе имени виртуального хоста

У меня была такая же проблема, когда я перенаправил SUPER + H на ВЛЕВО , что сработало, но не повторилось.

Это сработало, когда я добавил autorepeat = yesв определение ключевого символа.

Нашел здесь:http://web.archive.org/web/20190320180541/http://pascal.tsu.ru/en/xkb/gram-symbols.html

0
09.09.2020, 16:45
3 ответа

Дан файл с именем file.txt со следующими входными данными:

<VirtualHost *:443>
    ServerAdmin webmaster@domain.com
    ServerName name1

</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@domain.com
    ServerName name2

</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@domain.com
    ServerName name3

</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@domain.com
    ServerName name4

</VirtualHost>

и скрипт с названием get -virtual -host.sh с содержимым:

#!/bin/bash

if [ $# -ne 2 ]; then
    echo "Usage: get-virtual-host.sh <filename> <ServerName>"
    exit 1
fi

sed -ne "/^<VirtualHost/{x;:cycle n; /ServerName/{/ServerName[[:space:]]\+$2/!{s/.*//; x; d}}; /<\/VirtualHost/{H;x;p;q}; H; bcycle}" $1

затем вы можете получить раздел VirtualHost, указав параметр, подобный этому:

get-virtual-host.sh file.txt name2

который выводит

<VirtualHost *:443>
    ServerAdmin webmaster@domain.com
    ServerName name2

</VirtualHost>

Это то, что вам нужно?

Сценарий Sed объяснен в соответствии с запросом:

Команда sed говорит:

Если есть строка, начинающаяся с , выполните следующие действия:

  1. Обмен местами шаблона с пространством удержания
  2. прочитать следующую строку ввода
  3. если он содержит слово ServerName , проверьте, равно ли значение ServerName параметру 2, данному скрипту
  4. если не равно, удалите все в пространстве шаблонов, поменяйте местами шаблон и пространство хранения, удалите пространство шаблонов и запустите команду sed со следующей строкой ввода.
  5. если равно, проверить, содержит ли строка ввода конечный тег
  6. Если это так, добавьте новую строку к пространству для хранения, добавьте пространство шаблона к пространству для хранения, замените шаблон и пространство для хранения, распечатайте содержимое и выйдите
  7. в противном случае добавить новую строку в пространство хранения и добавить содержимое пространства шаблонов в пространство хранения и перейти к циклу меток (, шаг 2. выше)
1
18.03.2021, 23:06

@Juxtaposed --Я знаю тебя по группам unix.com... Ты эксперт в этих вещах

решение отлично работает для меня --, за исключением того, что мне пришлось

egrep -v "^$|^#" default-ssl.conf|egrep ServerName |while read S N
do
./get-virtual-host.sh default-ssl.conf $N > configs/$N.conf
done

и некоторые из файлов пусты --, но я могу жить с этим --только 2 из них были нулевого размера, хотя они также были полными виртуальными хостами.

В любом случае, большое спасибо за помощь.

-1
18.03.2021, 23:06

По сути, вы хотите разделить файл на каждый <VirtualHost, а затем переименовать их в соответствии со значением ServerName.

Шаг 1 :разделение файла

csplit -z -f vhost_ '/<VirtualHost/' '{*}'

csplitпозволяет разбивать файлы по заданному шаблону, здесь <VirtualHost, включенными параметрами являются:-f vhost_имена результирующих файлов с этим префиксом (новые файлы будут vhost_00, vhost_01,.... ), -zне создавать пустые файлы, {*}разбивать при каждом совпадении с образцом. Больше можно найти вman csplit

Шаг 2 :переименование файлов

Простая подпрограмма bash должна помочь:

for f in vhost_??
  do mv $f $(grep ServerName $f | awk '{print $2".conf"}')
done

Кажется, вы знакомы с awkи bash, поэтому не объяснили.

0
18.03.2021, 23:06

Теги

Похожие вопросы