Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 从最后一行打印特定字段_Perl_Bash_Awk - Fatal编程技术网

Perl 从最后一行打印特定字段

Perl 从最后一行打印特定字段,perl,bash,awk,Perl,Bash,Awk,我正在尝试分析此输出: $ top -b -d 1 -n 1 -p 5997 top - 08:54:39 up 86 days, 2:42, 1 user, load average: 0.00, 0.03, 0.05 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 8.9%us, 1.5%sy, 0.0%ni, 89.5%id, 0.1%wa, 0.0%hi, 0.0%

我正在尝试分析此输出:

$ top -b -d 1 -n 1 -p 5997
top - 08:54:39 up 86 days,  2:42,  1 user,  load average: 0.00, 0.03, 0.05
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  8.9%us,  1.5%sy,  0.0%ni, 89.5%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3869696k total,  2010912k used,  1858784k free,   162404k buffers
Swap:        0k total,        0k used,        0k free,   736120k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 5997 tomcat7   20   0 1209m 534m 6940 S  0.0 14.2  14:40.85 java

$
我的预期产出是:

534m 
所以我想从最后一行的第二行得到第六个字段。最后一行是空行,因此我看最后一行

以下是我的解决方案:

$ top -b -d 1 -n 1 -p 5997 | awk 'NF > 0' | awk 'END {print $6}'
539m
grep -oP 'VmRSS:\s*\K.*' /proc/<PID>/status 
首先删除空白行,然后从最后一行中提取第六个字段。它是有效的。完美

问题:

我不喜欢使用2 awk管道。因此,必须有一个优雅的解决方案来使用单个awk语句实现同样的效果。你能帮我吗

即使是Perl oneliner也会有所帮助

top -b -d 1 -n 1 -p 5997 | perl -anE '@r=@F if @F; END{ say $r[5] }'
perl在行上循环并将列值存储在@F中。它也将相同的值存储到@r数组中,但仅当非空行存在实际值时。 在最后一个非空行的“输出”列中。

给您:

awk 'now { print $6; exit } $1 == "PID" { now = 1 }'
说明:

命令将针对每行输入进行评估 变量now是未设置的,因此默认情况下不会执行now{…}的块 当第一个字段是PID时,我们现在将其设置为1,这样当下一行出现时,将执行now{…}块 在now{…}块中,我们打印第6个字段并退出以停止处理
获得倒数第二行的简单但通用的方法:

$ echo -e "abc\ndef\nijk" | tail -2 | head -1

下面是我如何用awk完成的


这将搜索带有PID的行,获得下一行并打印$6字段。当然,您可以将top和awk组合起来,以获得所需的任何文本部分。但对于您的要求,我认为ps更适合您:

ps -h --format rss <PID>
这是我使用上述命令和ps one的输出:


你可以很容易地用其他强大的工具代替grep,比如bc,awk。。。如果您愿意,可以获取mb单位。

有效+1.请你解释一下它在做什么好吗。我非常了解AWK的基本知识,非常感谢您。您好,虽然这个答案有效,但我将选择@Kent的答案,因为它也提供了正确的方法来使用mem。我正在做的是使用top,这不是一个好方法。谢谢。@slayedbylucifer我同意,肯特的答案更好,去吧!这给了我:ps-h-formatrss1715警告:糟糕的ps语法,可能是假的“-”?看见http://procps.sf.net/faq.html 284正确的值,但有一条错误消息。您有哪个版本?这里使用的是procps ng版本3.3.9,您也可以尝试:ps-h-o rss或read手册页,应该有格式化输出的选项@Jotne@Jotne我有与想象相同的版本。“我试过使用-o,效果也很好。”我添加了另一种获取数据的方法。如果您有不同的ps版本。@Jotne我使用的是'procps ng version 3.3.3',ps h-o rss工作正常,不会给出任何警告。他不喜欢2pipes@Jotne我知道这一点,只想给出一个提取倒数第二行的一般方法。谢谢你的解释。
grep -oP 'VmRSS:\s*\K.*' /proc/<PID>/status 
kent$  ps -h -o rss 25579                             
405304

kent$  grep -oP 'VmRSS:\s*\K\d*' /proc/25579/status 
405304