答案1
AFAIK 你不能简单地通过ps
带有选项的纯命令来实现它。但是,您可以使用一些文本处理器,例如awk
并使其执行您想要的操作:
ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'
这会从 中获取结果ps
,然后对于除了第一行之外的每一行,它会替换通常以 KB 为单位的第五列,然后添加 M 后缀到 MB。
您可以将其设为别名并将其存储在.bashrc文件,以便您可以通过类似myps
.
大多数人都在问如何保留格式或使用其他单位和精度。
对于简单版本,您可以使用column -t
输出过滤器:
ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t
然而,这不能正确识别最后一列中的空格。不幸的是,我们必须处理文本格式并以printf
类似格式准备我们自己的格式字符串。
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 个字段:$5=int(10*$5/1024)/10"M"
将值更改为具有一位小数的兆字节并添加“M”后缀。- printf 以类似列的方式显示所有字段:
%-10s
表示s
字符串,10
宽度为 10 个字符,-
左对齐%8s
表示s
字符串,8
8 个字符宽,并且由于没有-
输出,因此该字段是右对齐的。
substr(o, a)
o
从先前条件计算的位置开始获取原始行(因此之前存储)的子字符串a
,因此我们可以在保留空格的情况下显示命令输出。
答案2
我来这里寻找同样问题的解决方案。令人惊讶的是,目前还没有更好的答案。我根据这个线程和我在网上读到的其他页面创建了自己的稍微灵活的修复程序。
为了使内容更具可读性,我制作了一个自动范围功能并将其用于vsz
和rss
字段。
另外,看起来好像有是 实际上是一种方式强制使用任意字段分隔符ps
。我是这样做的:
我在使用位于联机AIX FORMAT DESCRIPTORS
帮助页子标题中的字段描述符时发现了一个明显未记录的技巧ps
。看起来,当您执行诸如USER 或VSZ 之%
类的操作时,它将在每个输出行之前包含任何字符。我想知道如果我尝试的话会发生什么。每行都显示一个。好的,不带空格的任意字符串怎么样?是的!!%U
%z
%%
%
但显然你有使%%
事情按预期进行。%
不明白。请注意,它将ps
尝试解析 后面的所有内容%
以查看其是否是有效的字段描述符。因此,将其保留在字符串末尾可能是最安全的,FOOBARBIGSTRINGBLABLA%%
以避免出现问题。
现在我只需要想出一个字符串,该字符串成为有效数据一部分的可能性相对较低 - 特别是当我用作cmd
字段时。zzz:::zzz
似乎不太可能。让我们%%
在末尾添加额外的内容即可使其正常工作 -zzz:::zzz%%
这在输出中显示为zzz:::zzz%
.
awk
我处理可以处理多字符字段分隔符的输出,告诉awk
查找zzz:::zzz%
作为字段分隔符。
|head -n20
最后是|cut -c -250
将输出限制为 20 行,并在 250 个字符后剪切每行,以保持终端的整洁。出于实际的脚本编写目的,您可能希望删除它们。
编辑:
我添加了一个变量来指出您还可以使用这些示例按任何字段进行排序。字段的名称可以在ps
标题下的联机帮助页中找到STANDARD FORMAT SPECIFIERS
编辑2: 根据要求,我添加了关于任意字段分隔符如何工作以及我选择字段分隔符的推理的更深入的解释。
实施例1
sortbyfield="rss"; fsep="-o zzz:::zzz%% -o"; ps ax o user:16 $fsep pid $fsep pcpu $fsep pmem $fsep vsz $fsep rss $fsep tty $fsep stat $fsep lstart $fsep time:16 $fsep cmd --sort -$sortbyfield | awk 'function setprefix(num){{n_suffix=1; while(num > 1000 && n_suffix < suffixes_len) {num /= 1024; n_suffix++;}; num=int(100*num)/100suffixes[n_suffix]}; return num} BEGIN{suffixes_len=split("kB MB GB TB PB EB ZB",suffixes);FS="zzz:::zzz%";} NR>1 {$5=setprefix($5);$6=setprefix($6); }{ printf "%-16s %6s %-5s %-5s %9s %9s %-8s %-8s %-25s %-18s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11;}' |head -n20 |cut -c -250
输出:(稍微净化过的示例)
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME CMD
gdm 1474 0.0 0.3 2.87GB 182.86MB tty1 Sl+ Sat Jun 18 01:31:44 2022 00:34:40 /usr/bin/gnome-shell
gdm 1370 0.0 0.0 171.3MB 34.31MB tty1 Sl+ Sat Jun 18 01:31:43 2022 00:01:56 /usr/libexec/Xorg vt1 -displayfd 3 -auth /run/user/42/gdm/Xauthority -background none -noreset -keeptty -verbose 3
gdm 1552 0.0 0.0 686.07MB 20.14MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:40 /usr/libexec/gsd-color
gdm 1577 0.0 0.0 870.49MB 19.53MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:01 /usr/libexec/gsd-media-keys
gdm 1538 0.0 0.0 531.81MB 18.51MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 /usr/libexec/gsd-xsettings
gdm 1541 0.0 0.0 539.53MB 18.5MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:04 /usr/libexec/gsd-power
gdm 1570 0.0 0.0 458.5MB 18.4MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 /usr/libexec/gsd-wacom
gdm 1500 0.0 0.0 386.57MB 17.94MB tty1 Sl Sat Jun 18 01:31:45 2022 00:00:00 /usr/libexec/ibus-x11 --kill-daemon
gdm 1537 0.0 0.0 386.13MB 17.92MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 /usr/libexec/gsd-clipboard
实施例2
稍微简洁的版本:
sortbyfield="rss"; fsep="-o zzz:::zzz%% -o"; ps ax o user:16 $fsep pid $fsep pcpu $fsep pmem $fsep vsz $fsep rss $fsep tty $fsep stat $fsep lstart $fsep time:16 $fsep comm --sort -$sortbyfield | awk 'function setprefix(num){{n_suffix=1; while(num > 1000 && n_suffix < suffixes_len) {num /= 1024; n_suffix++;}; num=int(100*num)/100suffixes[n_suffix]}; return num} BEGIN{suffixes_len=split("kB MB GB TB PB EB ZB",suffixes);FS="zzz:::zzz%";} NR>1 {$5=setprefix($5);$6=setprefix($6); }{ printf "%-16s %6s %-5s %-5s %9s %9s %-8s %-8s %-25s %-18s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11;}' |head -n20 |cut -c -250
输出:(稍微净化过的示例)
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
gdm 1474 0.0 0.3 2.87GB 182.86MB tty1 Sl+ Sat Jun 18 01:31:44 2022 00:34:40 gnome-shell
gdm 1370 0.0 0.0 171.3MB 34.31MB tty1 Sl+ Sat Jun 18 01:31:43 2022 00:01:56 Xorg
gdm 1552 0.0 0.0 686.07MB 20.14MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:40 gsd-color
gdm 1577 0.0 0.0 870.49MB 19.53MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:01 gsd-media-keys
gdm 1538 0.0 0.0 531.81MB 18.51MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 gsd-xsettings
gdm 1541 0.0 0.0 539.53MB 18.5MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:04 gsd-power
gdm 1570 0.0 0.0 458.5MB 18.4MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 gsd-wacom
gdm 1500 0.0 0.0 386.57MB 17.94MB tty1 Sl Sat Jun 18 01:31:45 2022 00:00:00 ibus-x11
gdm 1537 0.0 0.0 386.13MB 17.92MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 gsd-clipboard
希望这可以帮助那里的人!