
例えば。さまざまなユーザーが実行するプロセスは次のとおりです。
root 5
xuser 3
yuser 1
スクリプトの出力は次のようになります。
root .....
xuser ...
yuser .
答え1
printf
Bashを使用して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以下のユーザー名を受け入れるように行フォーマットを指定するように、最初のバリエーションで変更されました。