Linux bash 脚本:使用 awk 对一列求和以获得总体 cpu 利用率并显示所有字段

Linux bash scripting: Sum one column using awk for overall cpu utilization and display all fields

问题如下:

脚本:我使用 pid、用户...执行 ps 命令,我正在尝试使用 awk 对不同进程的总体 cpu 利用率求和。

命令:

> $ps -eo pid,user,state,comm,%cpu,command --sort=-%cpu | egrep -v '(0.0)|(%CPU)' | head -n10 | awk '
> { process[]+=; }
> END{
>   for (i in process)
>   {
>     printf(" "" "" ""%-20s %s\n",i, process[i]"   ") ;
>   }
> 
>    }' | sort -nrk 5 | head

Awk:根据进程名称(第4列)对第5列求和

输出:

 1. 10935 zbynda S dd              93.3   /usr/libexec/gnome-terminal-server
 2. 10935 zbynda S gnome-shell     1.9    /usr/libexec/gnome-terminal-server
 3. 10935 zbynda S sublime_text    0.6    /usr/libexec/gnome-terminal-server
 4. 10935 zbynda S sssd_kcm        0.2    /usr/libexec/gnome-terminal-server

如你所见,第四和第五列都很好,但其他的(rows/columns)只是ps命令的第一个条目。我应该有第四列中的 4 个不同的进程,但是例如,最后一列只显示一个相同的进程。

如何从 ps 命令中获取其他条目? (不仅是第一个条目)

试试这个

ps -eo pid,user,state,comm,%cpu,command --sort=-%cpu | egrep -v '(0.0)|(%CPU)' | head -n10 | awk '
 { process[]+=; a1[]=;a2[]=;a3[]=;a6[]=}
 END{
   for (i in process)
   {
     printf(a1[i]" "a2[i]" "a3[i]" ""%-20s %s\n",i, process[i]"   "a6[i]) ;
   }

    }' | sort -nrk 5 | head

an END rule is executed once only, after all the input is read.

您的 printf 使用 $6,它保留了最后一行的值。认为您想改用 "i" 。

当然 $1、$2 和 $3 也有同样的问题,因此您也需要保留传入值。给学生的练习是解决这个问题。