如何在Linux的非交互模式下限制top命令输出的行数

5

在非交互模式下,我们如何限制top命令输出的行数到特定数量(比如5)?


你正在寻找实时结果吗? - sjsam
是的 @sjsam。像批处理模式输出一样。 - Mathews Jose
3个回答

7

您必须提供-w选项而不带参数,并通过LINES环境变量指定所需的行数:

LINES=20 top -b -n 1 -w

请注意输出的宽度是通过COLUMNS环境变量控制的。因此,如果您的环境中已经设置了该变量,则必须在调用top时覆盖它。
LINES=20 COLUMNS=80 top -b -n 1 -w

或者
(unset COLUMNS; LINES=20 top -b -n 1 -w)

这适用于Ubuntu 15.10版本中包含的top版本。

$ top -v
  procps-ng version 3.3.9
Usage:
  top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]

显然,在所有版本的top中都没有-w选项。但是,您可以始终使用管道来限制输出:
top -b -n 1|head -n 20

1
@sjsam 在命令前这样设置会将其设置为执行的进程,而不是调用 shell 中的设置。 - Kusalananda
实际上,我在问题中进行了更正...我的机器是Linux机器...这有关系吗?我收到的错误是-w选项不可用。 - Mathews Jose
@MathewsJose 你使用的 top 版本是哪一个? - Leon
@Leon 我可以通过将结果导入 sed,去除类似于 LINES 27 的标题内容,例如 top -b -n 1 -w | sed -n '1,7!p'。在我的 top 版本3.3.9 中,顶部标题跨越了7行。 - sjsam
@Leon 版本是 3.2.8。 - Mathews Jose
显示剩余8条评论

2
我使用一个技巧,特别是针对批处理模式。我将退出管道传输到grep中,并使用选项“-A”显示匹配后的N行。
由于在top的第一行中有类似“负载平均值”的东西,我会用grep搜索它,例如:
$ top -d 5 -b|grep "load average" -A 15
top - 09:42:34 up 38 min,  1 user,  load average: 0.22, 0.39, 0.53
Tasks: 294 total,   2 running, 291 sleeping,   0 stopped,   1 zombie
%Cpu(s):  3.5 us,  0.9 sy,  0.0 ni, 94.6 id,  0.5 wa,  0.3 hi,  0.1 si,  0.0 st
KiB Mem :  8065144 total,  2213800 free,  2733524 used,  3117820 buff/cache
KiB Swap: 24575996 total, 24575996 free,        0 used.  4613128 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 2744 lrojas    20   0 3376820 752000 116588 R  20.2  9.3   9:30.01 firefox
 1869 lrojas     9 -11  566164  18336  14300 S   5.2  0.2   2:35.78 pulseaudio
 2401 lrojas    20   0  740092 200456  87256 S   2.4  2.5   0:57.29 skype
 2402 lrojas    20   0  617872 172924  76172 S   2.2  2.1   0:57.17 skype
 1333 root      20   0  459028  60992  48024 S   1.6  0.8   0:36.14 Xorg
 1838 lrojas    20   0 2103336 184468  64724 S   1.4  2.3   0:56.85 gnome-shell
 2359 lrojas    20   0  741212  35068  24620 S   1.4  0.4   0:06.83 gnome-terminal-
 2404 lrojas    20   0 1867556 229912  83988 S   0.8  2.9   0:19.63 thunderbird
 1249 apache    20   0  461436  10196   3404 S   0.4  0.1   0:00.57 httpd

这样可以以批处理模式继续运行,始终只显示输出的前N行。
对于任何版本的top,都是完全标准的解决方案。
干杯,
路易斯

2

针对OS X的答案:

$ top -l 1 -n 5

但是OS X的top默认按PID排序,所以您可能还想添加-o cpu

它很少在第一次迭代中正确获取%cpu...我认为这可能也是其他系统上top存在的问题。

根据您想要获取的实际数据,可能有更好的方法来获取它。解析交互式程序的输出是次优的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接