URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9747
[ Назад ]

Исходное сообщение
"Вопрос по парсингу конфига"

Отправлено TheFatal , 30-Сен-13 15:01 
Добрый день, есть вот такое задание:

есть конфиг nginx вида

server_name test.ru

location /
proxy_pass http://87.123.523463.1231

location /some
proxy_pass http://87.3231.561262.6262626

server_name test2.ru

location /
proxy_pass http://87.123.523463.1231

location /some
proxy_pass http://123.457457.47474.2414


нужно распарсить конфиг nginx так, чтобы выводились все server_name, в которых встречается proxy_pass http://87.123.523463.1231

собственно вопрос: какими средствами можно искать секцию server_name вверху от нужного proxy_pass ?


Содержание

Сообщения в этом обсуждении
"Вопрос по парсингу конфига"
Отправлено михалыч , 30-Сен-13 16:56 
grep -F -B `sed -n '$=' nginx.conf` 'http://87.123.523463.1231' nginx.conf | grep 'server_name'

не, так не катит.
Конкретно в вашем примере, достаточно было бы -B 3 , но конфиг nginx может быть другим ((


"Вопрос по парсингу конфига"
Отправлено TheFatal , 30-Сен-13 17:19 
> grep -F -B `sed -n '$=' nginx.conf` 'http://87.123.523463.1231' nginx.conf | grep
> 'server_name'

Большое спасибо за ответ, а не подскажете еще, как в вывод еще и location, в котором встретился искомый proxy_pass, добавить ? чтобы получилось что-то типа:

test1.ru
location /some


"Вопрос по парсингу конфига"
Отправлено михалыч , 30-Сен-13 17:23 
>> grep -F -B `sed -n '$=' nginx.conf` 'http://87.123.523463.1231' nginx.conf | grep
>> 'server_name'
> Большое спасибо за ответ, а не подскажете еще, как в вывод еще
> и location, в котором встретился искомый proxy_pass, добавить ? чтобы получилось
> что-то типа:
> test1.ru
> location /some

Пока редактировал свой первый пост, вы уже успели.
Наверху неправильно. Так он абсолютно ВСЕ server_name найдет.


"Вопрос по парсингу конфига"
Отправлено михалыч , 02-Окт-13 15:07 
>> grep -F -B `sed -n '$=' nginx.conf` 'http://87.123.523463.1231' nginx.conf | grep
>> 'server_name'
> Большое спасибо за ответ, а не подскажете еще, как в вывод еще
> и location, в котором встретился искомый proxy_pass, добавить ? чтобы получилось
> что-то типа:
> test1.ru
> location /some

Как через grep sed awk я не знаю, скорее всего можно, шахматы вон на sed реализовали.
Но чиста из спортивного интереса и любви к искусству, пришлось расчехлить perl ))

#!/usr/bin/perl


use strict;
use warnings;


my $conf = "nginx.conf";
my @arr;


open ( FILECONF, $conf ) or die $!;
my @lines = reverse <FILECONF>;
close FILECONF;


for ( @lines )
{
    chomp;
    s/#.*//;
    s/^\s+//;
    s/\s+$//;
    next unless length;


    if ( /87\.123\.523463\.1231/ ... /server_name/ )
    {
        unshift ( @arr, $_ );
    }
}


for ( @arr )
{
    s/^proxy.*$//;
    print $_, "\n";
}

выхлоп с него:

server_name test.ru
location /

server_name test2.ru
location /

server_name test6.ru
location /some