使用 awk 忽略 top 命令的前几行不起作用

Ignoring first few lines of top command with awk doesn't work

我正在尝试将 top 命令的输出保存到 csv 文件中。我想忽略 top 命令的前六行,其中包含例如 %cpu、MiB Mem 等信息。我正在使用 awk 实现如下:

$ top | awk "NR<=5 {next;} {print}

以上命令正确输出如下:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                 
75597 mustans+  20   0   21100   4292   3524 R  18.8   0.0   0:00.03 top                                                                     
1945 mustans+  20   0 5035316 296380  95244 S   6.2   1.8  35:58.70 gnome-shell

以上输出是所需的输出,但几秒钟后前六行也如下所示:

top - 12:24:40 up 2 days, 23:58,  1 user,  load average: 1.02, 0.83, 0.58
     17 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1                                                                 
%Cpu(s):  1.1 us,  1.0 sy,  0.0 ni, 95.1 id,  2.8 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15906.9 total,   2265.8 free,   7633.8 used,   6007.3 buff/cache
MiB Swap:   7629.0 total,   7625.9 free,      3.1 used.   7260.9 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                 
    747 systemd+  20   0   24492  13784   9336 S   3.7   0.1   0:08.20 systemd-resolve                                                         
  37955 mustans+  20   0 7648180   2.0g  63944 S   3.7  12.7  94:16.16 java            

如何确保 top 命令的每个 refresh 都应使用 awk 跳过前几行。谢谢!

top 的管道输出不会在每次刷新时都重新开始,您最终会得到一长串被发送到 awk 的行。您只丢弃了前 5 行。

你可以让它重新启动并通过使用 watch 每秒自己执行它来获得你想要的东西,例如 watch -n 1 'top -n 1 | awk "NR<=5 {next;} {print}"'

虽然这可能不是完成您想要做的事情的最佳方式....您可能想看看使用 ps 之类的东西来获取您想要的信息而不是必须使用 awk.

我已经通过 ps 命令以所需格式输出,即删除最初的几行,然后将命令与 cpu %.

一起打印
ps -eo cmd,%cpu -p$(pidof process1),$(pidof process2) | awk "NR==1 {next;} {print }