如何从Perl中的逗号分隔值中提取值?

时间:2010-04-08 08:34:32

标签: regex perl

我有一个包含来自不同服务器的统计信息的日志文件。我只使用正则表达式将统计信息与此日志文件分开。 我试图从正在运行的进程中捕获CPU使用情况。对于SunOS,我的输出低于:

process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java

如果我们用逗号(,)分隔,那么CPU%在第11个字段。此字段具有%符号,这是唯一的,我可以使用以下正则表达式来获取此值:

regex => q/^process,(?:.*?),((?:\d+)\.(?:\d+))%,java$/,

对于linux系统,我有以下输出:

process,26190,user1,20,0,1236m,43m,6436,S,0.0,1.1,0:00.00,java,

这里的CPU使用率是第10列,但没有%符号,我没有看到这个字段的唯一信息。

我应该使用什么正则表达式来获取此值?

5 个答案:

答案 0 :(得分:3)

如果该行已经以逗号分隔,您只需在字符串上使用split并选择正确的字段。

e.g。

my @fields = split(/,/, $input);

答案 1 :(得分:2)

您是否也需要识别该行,或者只提取该值,即您是否期望某些不相关的行?如果不是答案的话 /^(?:[^,]+,){9}([^,]+)/' 这将从一些以逗号分隔的列表中提取第十个字段

答案 2 :(得分:1)

使用Text::CSV_XS处理以逗号分隔的值。如果你问这个问题,你不应该试图自己处理它。该模块经过极度优化,您无法自己做得更好。

一旦你提取了正确的位置,就可以剥掉%符号,如果它在那里。

答案 3 :(得分:-1)

你的数据结构有明显的分隔符,所以不要使用正则表达式,只需使用拆分并通过索引(或切片)获取项目。它更容易。

$output="process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java";
@s = split /,/,$output;
print "$s[10]\n";

对于linux,只需获取$s[9]

答案 4 :(得分:-1)

我对Linux一无所知,但如果看起来过于天真,则忽略代码:)

 /^process.*(?<=[A-Z],)((?:\d+)\.(?:\d+)).*java$/;
相关问题