我有一个包含来自不同服务器的统计信息的日志文件。我只使用正则表达式将统计信息与此日志文件分开。 我试图从正在运行的进程中捕获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列,但没有%符号,我没有看到这个字段的唯一信息。
我应该使用什么正则表达式来获取此值?
答案 0 :(得分:3)
答案 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$/;