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[用户名]”中的值增加第 4 列中的值。如果数组键尚不存在,则创建它,初始化为 0,然后将其增加第 4 列的值。

当 Awk 对每一行都执行完此操作后,它会运行“END”块中的代码,该代码表示​​打印出每个用户名(x 中的 z)以及与该用户关联的最终聚合值(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 回答