用于获取 Linux 进程并将单个用户的进程计数显示为“.”的 Shell 脚本

用于获取 Linux 进程并将单个用户的进程计数显示为“.”的 Shell 脚本

例如。不同用户正在运行的进程如下。

root 5
xuser 3
yuser 1

然后脚本的输出应为:

root .....
xuser ...
yuser .

答案1

您可以使用 bashprintftr绘制此直方图:

while read name num; do 
    dots=$(printf "%*s" $num " " | tr " " .)
    printf "%s\t%s\n" "$name" "$dots"
done <<END
root 5
xuser 3
yuser 1
END
root    .....
xuser   ...
yuser   .

答案2

使用 Perl,并假设数据位于file

$ perl -ne '/^(\w+)\s+(\d+)$/ && printf("%s\t%s\n", $1, "." x $2)' file
root    .....
xuser   ...
yuser   .

您还可以将其应用于数据流:

somecommand | perl -ne '...as above...'

Perl 脚本匹配输入中的初始字符串和数字,然后输出字符串和适当数量的点,中间有一个制表符。


对上面的内容进行一些调整(以便能够读取uniq -c输出,其中包含数字第一的),以下代码将获取每个用户运行的进程数并将计数显示为点:

$ ps -ax -o user= | sort | uniq -c | perl -ne '/^\s*(\d+)\s+(\w+)$/ && printf("%-10s%s\n", $2, "." x $1)'
_dbus     .
_dhcp     .
_ntp      ..
_pflogd   .
_slaacd   ..
_smtpd    .....
_smtpq    .
_syslogd  .
_unbound  .
kk        ................
root      ..........................

命令ps可能需要修改才能在 Linux 上输出正确的内容(我在这里使用 OpenBSD,但它似乎在 Ubuntu 上也能做正确的事情)。 Perl 脚本与第一个变体相比已发生变化,以便它可以正确读取uniq -c输出并格式化行以允许长度为 10 或更短的用户名。

相关内容