过滤顶部命令输出


12

我正在运行Mac,想过滤top特定进程的命令输出,以便仅显示PID,COM​​MAND和%CPU列。

获取进程的PID后,我运行:

top -pid 1234

但是,该过程显示超过15列。我可以将'command的输出输入到awk并仅显示:

PID COMMAND %CPU

列?

我不想将输出存储在文本文件中然后进行处理。我对实时监控过程感兴趣。

Answers:


8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907:您的进程ID
  • -stats pid,command,cpu:仅显示进程ID,名称和CPU%

无需awk在输出上运行。


如果要对输出进行后处理,请使用-l 0来以日志记录模式运行(0表示无限期,其他所有条件均会限制样本数量)。输出将如下所示(两个重复):

Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09 
CPU usage: 20.0% user, 26.66% sys, 53.33% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 0.0 
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09 
CPU usage: 0.95% user, 1.90% sys, 97.14% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 2.7 

使用awk或类似的工具仅显示第13行(因为这些行包含该示例中的值):

$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907  WindowServer 0.0 
3907  WindowServer 1.3 
3907  WindowServer 2.2 

# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg

@AstraSerg为我工作。请注意,这是一个Mac OS问题,top与Linux 有所不同。
丹尼尔·贝克

6

当然可以做到,我将解释我将如何做。我不假装这是一种最佳方法,但确实可以做到。我正在使用Linux(和bash shell),因此top的默认行为可能会略有不同。因此,您可能需要针对特定​​情况调整此微型操作方法。

  1. 只需运行top,不带任何参数:

    $ top

    这是我的输出中的标题和相关行:

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java

    我选择了一个在内存中保留一段时间并实际上消耗CPU的进程,我将使用它作为达到最终目标的测试过程。

  2. 默认情况下,top以交互模式运行。这不适合我,我想捕获相关数据并打印出来。之后,我将处理以交互方式显示数据的任务。热门手册中的相关报价:

    -b:批处理模式操作以“批处理模式”开头,这对于从顶部向其他程序或文件发送输出很有用。在此模式下,top将不接受输入并运行,直到使用“ -n”命令行选项设置的迭代限制或终止为止。

    -n:迭代次数限制为:-n number指定top在结束之前应该产生的最大迭代次数或帧。

    这是调整后的top命令,仅输出一次,然后退出:

    $ top -b -n 1

  3. 我知道我想观看的PID,因此我将在顶部再添加一个限制,因此它仅打印有关该过程的数据:

    $ top -b -n 1 -p 2569

  4. 即使在批处理模式下,top仍会打印一个标头,其中包含杂项系统范围的统计信息,例如正常运行时间,可用内存/交换等。我不需要此信息。我只需要一行-包含有关我的过程数据的那一行,因此我将像这样从整个输出中删除它:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1

    如您所见,我从1得到第二行。

  5. 我会将这条线通过管道发送到awk以仅提取我需要的列:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  6. 到目前为止,我一直在命令行中进行这些操作,现在是时候为我们的硬编码特殊情况添加一些持久性和灵活性。我将整行代码移动到一个简单的shell脚本中。我将其命名为3top,因为该名称将在以后使用,所以会强调该名称:

    #!/bin/bash

    top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  7. PID号是硬编码的,这是使脚本将其接受为命令行参数的方法:

    #!/bin/bash

    top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

    要使3top显示有关PID 2569的统计信息,必须像这样调用它:

    $ ./3top 2569

  8. 我还希望在CPU负载后显示百分比,因此我正在像这样调整3top脚本:

    #!/bin/bash

    out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')

    echo "$out%"

    我已将命令链(通过管道连接)的整个输出重定向到一个变量中。然后,我仅使用echo进行打印,并在最后添加“%”,因为CPU负载是最后一个字段

  9. 至此,我有了一个批处理脚本,该脚本接受PID作为参数并打印一次统计信息。需要实时监控吗?很简单,因为手表可以做到!像这样运行脚本:

    $ watch -n 1 3top 2569

    它将通过每秒运行3top进行实时监视。


11
用户使用的是OS X,没有Gnu top无效的选项或语法:-b。不知道为什么一再被否决。
丹尼尔·贝克

5
Gnu top(in procps)无法使用Homebrew,MacPorts或Fink安装,也无法使用make或从源代码进行编译cc top.c
丹尼尔·贝克

2

top显示格式是可定制的,但没有指定在命令行显示选项的方式。但是,如果您具有创造力,则可以通过巧妙地处理~/.toprc文件来完成所需的工作。

假设您尚未自定义的显示top(并且没有~/.toprc文件):

  1. 启动top
  2. f进入字段选择模式。
  3. 对于*不需要的下一个字段,请按相应的字母以取消选择该字段。例如,按e取消选择该User Name字段。当你做,你应该只有一个*旁边Process IdCPU usageCommand name/line
  4. Space返回主窗口。
  5. W(即Shift+ w)将当前布局保存到~/.toprc文件中。
  6. 退出top,然后重新启动以确认您的设置已保存。
  7. 如果要返回默认布局,请在启动前重命名~/.toprc为。如果要切换到最小布局,请在启动前重命名为。~/min.toprctop~/min.toprc~/.toprctop

重命名和启动该文件的top人员可能比我拥有更多的经验和知识,可以将其改成简单的shell脚本。如果您的常规top布局已自定义,则需要特别注意。


是否可以添加过滤器(即使手动).toprc?我喜欢RUID>999在启动时添加过滤器。
Beco博士
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.