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 也有同样的问题,因此您也需要保留传入值。给学生的练习是解决这个问题。
脚本:我使用 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 也有同样的问题,因此您也需要保留传入值。给学生的练习是解决这个问题。