4

awkを使用して演習を解決する必要があります。基本的に、「ps aux」コマンドから、各ユーザーのメモリ使用量の合計と次のような形式を取得する必要があります。

User    Total%Mem
user1      3.4%
user2      1.5%

等々。

私が解決できないと思われる問題は、ログインしているユーザーの数をどのように知ることができるかということです。そして、どうすればそれらのそれぞれに対して異なる合計を作ることができますか?

ありがとうございました :)

4

4 に答える 4

9

そのことを知る必要はありません。知っておく必要があるのは次のとおりです。

  1. 各行に同じ数の列を持つ列出力があります。
  2. 最初の列はユーザ​​ーのログイン名です。
  3. 4番目の列は%MEM列です。
  4. Awkは変数を0で自動的に初期化します。
  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]}'
于 2010-04-16T23:58:07.347 に答える
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
}
于 2010-04-16T23:50:30.343 に答える
1
ps -eo user,pmem| awk 'NR>1{u[$1]+=$2}END{for(i in u)print "user: "i",mem: "u[i]}'
于 2010-04-16T23:50:55.923 に答える
1

適切にフォーマットされ、最も高いコンシューマーからソートされ、列番号変数
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" }
    }'
于 2018-10-23T08:23:46.710 に答える