使用正则表达式进行特殊的行匹配

时间:2014-10-08 06:58:40

标签: regex

This script may take a while to run, especially on a busy podmaster.
Generating Syslog TopN list on node for last 3 hours.

        Top 5 hosts for Day: Oct8 between 02:00:00 and 02:59:59
            Rank       Number of Alerts Host
            ----       ---------------- ----
        1       3124        aaa
        2       2294        bbb
        3       2157        ccc
        4       832     ddd
        5       816     eee

Top 5 hosts for Day: Oct8 between 01:00:00 and 01:59:59
        Rank       Number of Alerts Host
        ----       ---------------- ----
        1       5495        fff
        2       2625        ggg
        3       998     hhh
        4       752     iii
        5       741     jjj

Top 5 hosts for Day: Oct8 between 00:00:00 and 00:59:59
        Rank       Number of Alerts Host
        ----       ---------------- ----
        1       2747        kkk
        2       876     lll
        3       780     mmm
        4       724     nnn
        5       309     ooo

我使用下面的正则表达式来匹配这种格式。

\s+[1]+\s+([\d]+).*

上面表达式的输出是

$1 = 3124 5495 2747

但是我需要正则表达式来分别匹配排名1。

Example output:
$1 = 3124 
$2 = 5495 
$3 = 2747

请帮我解决一下。

4 个答案:

答案 0 :(得分:2)

你的正则表达式没有错。

这只是一种格式差异:

use strict;
use warnings;

my $data = do {local $/; <DATA>};

my @ones = $data =~ m/^\s*[1]\s+([\d]+)/mg;

for my $i (0..$#ones) {
    printf "\$%d = %s\n", $i+1, $ones[$i];
}

__DATA__
        Rank       Number of Alerts Host
        ----       ---------------- ----
        1       3124        abc
        2       2294        bcd



        Rank       Number of Alerts Host
        ----       ---------------- ----
        1       5495        cdf
        2       2625        klm


        Rank       Number of Alerts Host
        ----       ---------------- ----
        1       2747        lll
        2       876         jjj

输出:

$1 = 3124
$2 = 5495
$3 = 2747

live demo

答案 1 :(得分:1)

如果输入包含您发布的确切字符串,请将正则表达式更改为以下内容。

(?s)\s+1+\s+([\d]+).*?\s+1+\s+([\d]+).*?\s+1+\s+([\d]+)

DEMO

对于javascript,

\s+1+\s+([\d]+)[\S\s]*?\s+1+\s+([\d]+)[\S\s]*?\s+1+\s+([\d]+)

DEMO

答案 2 :(得分:0)

Rank.*?\n.*?\n1\s*(\d+)

试试这个。标志g

参见演示。

http://regex101.com/r/hQ1rP0/58

答案 3 :(得分:0)

在您关于IPautomata designer

的重复提问中注意到这一点
  

我们正在使用新的IPsoft工具,它有两个选项。

1. Line Filter(JavaScript regex)
2. Match(JavaScript regex)
     

例如,如果我们需要匹配alertcount(3124)。首先过滤行&gt;然后匹配相同的行。就像我需要匹配另外两个警报计数(5495&gt;和2747)。请帮我解决一下。

如果您尝试从主机命令状态或任何状态的OUTPUT变量捕获输出,则可以使用“提取变量”选项卡: Name: capture_variable Line Filter: \s+1\s+.* Match: .*1\s+(\d+).* Replace: $1

这会将capture_variable设置为等于多行字符串,如下所示:

3124
5495
2747