例如。不同用户正在运行的进程如下。
root 5
xuser 3
yuser 1
然后脚本的输出应为:
root .....
xuser ...
yuser .
答案1
您可以使用 bashprintf
并tr
绘制此直方图:
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 或更短的用户名。