2

在此处输入图像描述下面的问题:

脚本:我使用 pid,user... 执行 ps 命令,我正在尝试使用 awk 来汇总不同进程的总体 CPU 利用率。

命令:

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

awk:根据进程名求和第5列(第4列)

输出:

 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

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

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

4

2 回答 2

1

尝试这个

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

    }' | sort -nrk 5 | head

END读取所有输入之后,规则只执行一次。

于 2020-06-06T15:21:58.053 回答
0

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

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

于 2020-06-06T15:23:48.107 回答