2016-05-01 4 views
-2

Я пытаюсь найти строку в конфигурационном файле HAproxy:Regex для поиска строки в разделе

global 
     log 127.0.0.1 local0 
     log 127.0.0.1 local1 notice 
     #log loghost local0 info 
     maxconn 32768 
     tune.maxaccept -1 
     chroot /var/lib/haproxy 
     daemon 
     stats socket /var/run/haproxy.sock mode 600 level admin 
     stats timeout 2m 
     timeout http-request 5000 

defaults 
     log  global 
     mode http 
     option httplog 
     option dontlognull 
     retries 5 
     option redispatch 
     maxconn 16384 
     timeout connect 7s 
     timeout client 500s 
     timeout server 500s 
     timeout http-request 7000 
     timeout client-fin  30s 
     timeout tunnel 1h 

Что такое регулярное выражение, чтобы соответствовать линии timeout http-request 5000, но только в global разделе. Кроме того, нам необходимо обеспечить исключение #.

+0

Какой язык программирования вы используете? –

ответ

1

Вы можете использовать шаблон

^global\b(?:(?:(?:#|[ \t]+)[^\n]*|)\n)*?\s+(timeout\s+http-request\s+\d+) 

с многострочным модификатором m. Это должно поддерживать прокомментированные строки (с #) и не полагается на раздел defaults после раздела globals, как и все остальные ответы.

Текст timeout http-request 5000 будет в группе захвата 1.

Regex101 demo.

Объяснение:

^global\b  find the "global" section, this must not be indented 
(?:   then consume any number of lines that are... 
    (?: 
     (?:#  ...commented... 
     |[ \t]+) ...or indented... 
     [^\n]* 
     |  ...or empty 
    )\n 
)*? 
\s+(timeout\s+http-request\s+\d+) finally capture the line we're looking for 
+0

Это работает.Я не уверен, почему другие отметили этот вопрос как вопрос «нужно изучать регулярное выражение». Я знаю regex довольно хорошо, но да, не про, чтобы написать такое сложное регулярное выражение. В любом случае, спасибо большое Rawing за то, что помогли мне, я попытаюсь использовать regex101 с этого момента. Еще раз спасибо. – praving5

+0

Привет @Rawing, снова застрял. 'case" $ 1 "в start) echo -n" Запуск haproxy " ## Запустить демон с помощью startproc (8). Если это не удается ##, то возвращаемое значение устанавливается соответствующим образом startproc. haproxy_check /SBIN/startproc $ HAPROXY_BIN -D -f $ HAPROXY_CONF -p $ HAPROXY_PID # Помните статус и быть многословным rc_status -v ;; '- в этом я хочу соответствовать haproxy_check. Я пробовал разные вещи, включая '^ \ s * start \) (?: (?: (?: # | [\ T] +) [^ \ n] * |) \ n) *?^\ S * haproxy_check'. Кажется, это таймаут, если haproxy_check закомментирован. Любая помощь? – praving5

+0

@ praving5 Вам нужно дать более подробную информацию о том, что вы пытаетесь сделать. Если все, что вы говорите, это «Я хочу сопоставить haproxy_check», тогда, должно быть, должно выполняться регулярное выражение 'haproxy_check'. Вероятно, лучше поставить новый вопрос. –

0

Посмотрите на это регулярное выражение: https://regex101.com/r/sI5qY6/1

/global.*(timeout\s+http-request\s+\d+).*?defaults/s 

Это дает следующий матч:

MATCH 1 
1. [304-329] `timeout http-request 5000` 
0

Это один, вероятно, сделать это очень быстро, только в 66 шагов в случае тайм-аута HTTP-запроса 5000 находится в самом конце глобального значения

timeout\shttp-request\s+\d+(?=\s*defaults) 

Regular expression visualization

Debuggex Demo

https://regex101.com/r/yW9xZ6/2

если тайм-аут HTTP-запроса 5000 может быть размещен в любом месте в глобальной группе, то

/timeout\shttp-request\s+\d+(?=[\s\S]+defaults)/m 

https://regex101.com/r/yW9xZ6/3

0

awk удобно для поиска Winthin блока.

Дайте этому попытку:

awk -F "#" '/^global/,/^defaults/ {if ($1 ~ /timeout *http-request/) {print $1}}' haproxy.conf 

-F "#" определяет # в качестве разделителя полей, так $1 является строкой перед # в текущей строке.

'/^global/,/^defaults/ { для всех линий в блоке, образованном между global и defaults, выполнить действия между {}.

if ($1 ~ /timeout *http-request/ это правда, если строка до # (при наличии) содержит имущество timeout *http-request.

Смежные вопросы