awkを使用して演習を解決する必要があります。基本的に、「ps aux」コマンドから、各ユーザーのメモリ使用量の合計と次のような形式を取得する必要があります。
User Total%Mem
user1 3.4%
user2 1.5%
等々。
私が解決できないと思われる問題は、ログインしているユーザーの数をどのように知ることができるかということです。そして、どうすればそれらのそれぞれに対して異なる合計を作ることができますか?
ありがとうございました :)
そのことを知る必要はありません。知っておく必要があるのは次のとおりです。
Awkインデックスキーは任意の値です:)
ps aux | awk 'NR != 1 {x[$1] += $4} END{ for(z in x) {print z, x[z]"%"}}'
入力をawkにパイプし、1行目をスキップするように指示します(NR!= 1)。次に、すべての行について、次のように英語で読みます。
配列'x'で、'x[username]'の値を4列目の値だけインクリメントします。配列キーがまだ存在しない場合は、それを作成し、0で初期化してから、4列目の値でインクリメントします。
Awkがすべての行に対してこれを実行すると、「END」ブロックのコードが実行され、各ユーザー名(z in x)とそのユーザーに関連付けられた最終的な集計値(x [z])が出力されます。 、その後に「%」が続きます。
行ごとにビルドされることを確認したい場合は、同じ基本ルールを使用できますが、「END」ではなく、各行が処理された後に印刷を追加します。
ps aux | awk 'NR != 1 {x[$1] += $4; print $1, x[$1]}'
連想配列を使用して、ユーザーごとのメモリ使用量を累積します。配列を反復処理できるため、ユーザーの数を知る必要はありません。今まで持っているものを見せてみませんか?
このようなプログラムが持つであろう擬似コードの基本構造は次のとおりです。
BEGIN { print headers, do other setup if needed }
{
add the %mem field to the array element indexed by the user name
}
END {
for each element in the array
print the name and the total
add the total to a grand total
print the grand total
}
ps -eo user,pmem| awk 'NR>1{u[$1]+=$2}END{for(i in u)print "user: "i",mem: "u[i]}'
適切にフォーマットされ、最も高いコンシューマーからソートされ、列番号変数
coln=6に設定してキロバイトを表示します
ps aux | awk 'BEGIN {coln=4; getline; col=$coln};
{arr[$1]+=$coln};
END {printf ("%15s %s\n", "USER",col);
for (i in arr) {printf("%15s %s\n", i,arr[i])|"sort -k 2,2rn" }
}'