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