如何使ps命令以mb代替kb显示内存?


11

Linux ps命令显示不同的内存使用情况,例如rss,默认情况下以kb为单位。有没有办法像mb或gb所示ls -s --human-readable


1
缺少提及在man ps我看来,没有这样的内置选项。
Ulrich Schwarz

Answers:


20

AFAIK您不能仅通过ps带有选项的纯命令来实现它。但是,您可以使用像这样的某些文本处理器,awk并使其执行您想要的操作:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'

这取结果ps,然后除第一行外的所有行都替换为通常以KB为单位的第5列到MB加M后缀。

您可以将其命名为别名并将其存储在.bashrc文件中,以便可以通过调用它myps

大多数人都在问如何保留格式或使用其他单位和精度。

对于简单版本,可以使用column -t输出过滤器:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t

但是,这不能正确识别最后一列中的空格。不幸的是,我们必须处理文本格式,并准备自己的格式字符串,printf类似于-like格式。

ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'

说明:

  • NR==1条件仅适用于第一行(标题)。我们使用原始的ps输出来确定COMMAND从哪里开始:
    • o=$0 存储未修改的整行,以便我们稍后使用
    • a=match($0,$11) 查找第11个字段的位置(应该是原始输出中COMMAND列的起始位置)
  • NR>1用于以下几行(数据)。我们正在改变第五领域:
    • $5=int(10*$5/1024)/10"M" 将值更改为兆位(小数点后一位),并添加“ M”后缀。
    • printf以类似列的样式显示所有字段:
      • %-10s表示s字符串,10宽10个字符,-左对齐
      • %8s表示s字符串,8表示8个字符宽,并且由于-该字段没有输出而右对齐。
    • substr(o, a)oa先前条件中计算的位置开始获取原始行的子字符串(因此存储在此之前),因此我们可以显示命令输出并保留空格。

3
修改为GB,并保留小数点后2位(例如1.23GB):ps aux | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{ print;}'
mahemoff '18

1
是否有可能达到保留ps格式的相同目标?标签完全被剥夺了awk
克里斯(Chris)

我看到您将类型转换为int,是否可以将其设置为1.2M之类的小数?
JavaSheriff '19

为什么缺少标签?
Alex78191

@ Alex78191:添加了用于格式化表格式输出的替代命令
DevilaN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.