多行回溯正则表达式

洛根

我正在使用一个脚本,该脚本将一堆内存值输出到日志文件,并且我需要提取一些相对于彼此的特定行。

以下是日志输出的一部分示例:

       Pool ID      Type      Term       User/Sys     Total Size           Free
       -------      ----      ----       --------     ----------           ----
0x7FC636000000   CONTROL      LONG           USER     1609564160      335224768

     Client ID      Memory Alloc'd      (Normal/Small)    Client Name
     ---------      --------------      --------------    -----------
0x7FC636001A90             7470051       (7469056/995)    DiskControl
0x7FC6360017D8             4067072         (4067072/0)    KJS
0x7FC636001520          1158242183 (1157640768/601415)    PLU
0x7FC636001268            68499632     (68498240/1392)    Splitter
0x7FC636000FB0            36665368     (36664256/1112)    BackView

我需要提取PLU行:

0x7FC636001520          1158242183 (1157640768/601415)    PLU

我还需要提取池ID

0x7FC636000000   CONTROL      LONG           USER     1609564160      335224768

此块是其中的一个,在不知道客户端在哪里的情况下,无法确定要抓住哪个池ID(因此,在找到该池之前,我需要先找到PLU的位置)。

找到PLU线很容易:

/(.*)PLU/

但是,事实证明,找到泳池线要困难得多。

我发现了使用多行正则表达式搜索的建议,但似乎行不通。我也尝试过使用似乎无效的回溯。

暂时忽略与特定客户端和池的必要关系,我仅针对池行尝试了此操作:

/(?<=----).*(?=Client)/gm

这并没有突出显示regexr上的任何内容。

如果有人能提供帮助,我将不胜感激。我正在使用Perl编写此脚本以提取信息(整个基础结构都在Perl中)。

鲍罗丁

将整个文件读取到内存中通常是一个坏主意,因为您通常需要将其拆分为几行以进行处理,因此您最好先逐行读取它

如果我对您的理解正确,则只需要存储遇到的每个池ID。然后,当您找到PLU客户端时,相关的池ID是您遇到的最新池ID。

看起来像这样

use strict;
use warnings 'all';

my ($pool_id, $client_id);

while ( <DATA> ) {
    if ( /Pool ID/ ) {
        while ( <DATA> ) {
            last if ($pool_id) = /^0x(\p{hex}+)/;    
        }
    }
    elsif ( /\sPLU\s*$/) {
        ($client_id) = /^0x(\p{hex}+)/;
        last;
    }
}

print "Pool ID:       $pool_id\n";
print "PLU Client ID: $client_id\n";

__DATA__
       Pool ID      Type      Term       User/Sys     Total Size           Free
       -------      ----      ----       --------     ----------           ----
0x7FC636000000   CONTROL      LONG           USER     1609564160      335224768

     Client ID      Memory Alloc'd      (Normal/Small)    Client Name
     ---------      --------------      --------------    -----------
0x7FC636001A90             7470051       (7469056/995)    DiskControl
0x7FC6360017D8             4067072         (4067072/0)    KJS
0x7FC636001520          1158242183 (1157640768/601415)    PLU
0x7FC636001268            68499632     (68498240/1392)    Splitter
0x7FC636000FB0            36665368     (36664256/1112)    BackView

输出

Pool ID:       7FC636000000
PLU Client ID: 7FC636001520

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章