我正在使用一个脚本,该脚本将一堆内存值输出到日志文件,并且我需要提取一些相对于彼此的特定行。
以下是日志输出的一部分示例:
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] 删除。
我来说两句