我需要打印基于"常驻集大小"值排序的整个输出。
进程:wccpd
内存(字节(
总虚拟大小29.5
常驻机组尺寸4.0
进程:写回
内存(字节(
总虚拟大小0
常驻集大小0
进程:zxfrd
内存(字节(
总虚拟大小71.3
常驻机组尺寸3.9
perl
非常擅长这类事情:
#!/usr/bin/env perl
use 5.12.0;
$/ = ""; # enable "paragraph mode"
my @f;
while(<DATA>) {
m/Resident Set Size (.*)/;
push @f, [$1, $_];
}
say $_->[1] foreach sort { $a->[0] <=> $b->[0] } @f;
__DATA__
Process: wccpd
Memory (bytes)
Total Virtual Size 29.5
Resident Set Size 4.0
Process: writeback
Memory (bytes)
Total Virtual Size 0
Resident Set Size 0
Process: zxfrd
Memory (bytes)
Total Virtual Size 71.3
Resident Set Size 3.9
这个想法很简单。将$/
(也称为$INPUT_RECORD_SEPARATOR
或$RS
(设置为空字符串将CCD_;段落模式";其中记录用空行分隔。然后,我们一次读取一个记录并解析每个记录以匹配";常驻集大小";然后,我们推送一个数组引用,该引用由[0]中的值和[1]中的整个记录组成。然后使用<=>
运算符比较排序函数中的记录。
如果您在文件input
中有输入,并且想直接执行类似的操作,您可以执行:
perl -00 -nE 'm/Resident Set Size (.*)/; push @f, [$1, $_]}
{ say $_->[1] foreach sort { $a->[0] <=> $b->[0] } @f' input
这与上面的脚本完全相同,其中-n
执行while(<>)
循环,-00
启用段落模式。奇怪地不匹配的} {
是用于-n
的perl
习惯用法。-n
标志基本上在整个脚本周围放置一个while(<>){ }
循环,我们用第一个}
结束该循环,并用(似乎不匹配的({
匹配其右大括号。