Linuxプロセスをインポートし、個々のユーザーのプロセス数を「.」としてマークするシェルスクリプト

Linuxプロセスをインポートし、個々のユーザーのプロセス数を「.」としてマークするシェルスクリプト

例えば。さまざまなユーザーが実行するプロセスは次のとおりです。

root 5
xuser 3
yuser 1

スクリプトの出力は次のようになります。

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

答え1

printfBashを使用して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以下のユーザー名を受け入れるように行フォーマットを指定するように、最初のバリエーションで変更されました。

関連情報