regex 用于在节中查找行的正则表达式

lrl1mhuk  于 2023-06-30  发布在  其他
关注(0)|答案(4)|浏览(134)

我试图在haproxy配置文件中找到一行:

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部分。此外,我们需要确保排除#

mefy6pfw

mefy6pfw1#

你可以使用模式

^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
zqdjd7g9

zqdjd7g92#

看看这个regex:https://regex101.com/r/sI5qY6/1

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

它给出以下匹配:

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

lsmepo6l3#

这一个可能会做得非常快,只有在66个步骤的情况下,超时HTTP-Request 5000是在全球的最后

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

Debuggex Demo
https://regex101.com/r/yW9xZ6/2
如果超时HTTP-Request 5000可以放置在全局组中任何位置,则

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

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

pdkcd3nj

pdkcd3nj4#

awk在一个块中搜索很方便。
给予这个:

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

-F "#"定义#作为字段分隔符,所以$1是当前行#之前的字符串。
'/^global/,/^defaults/ {对于globaldefaults之间定义的块内的所有行,执行{}之间的操作。
if ($1 ~ /timeout *http-request/如果#之前的字符串(如果有)包含属性timeout *http-request,则为true。

相关问题