使用awk从'ps aux'输出获取内存使用情况

时间:2010-04-16 22:41:35

标签: awk ps

我必须使用awk解决练习。基本上我需要从'ps aux'命令检索每个用户的内存使用总量和格式,如下所示:

User    Total%Mem
user1      3.4%
user2      1.5%

等等。

我似乎无法解决的问题是:我如何知道有多少用户登录?我怎样才能为每一个做出不同的总和呢?

谢谢:)

4 个答案:

答案 0 :(得分: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]"%"}}'
    
  6. 我将输入传输给awk,然后我告诉它跳过第1行(NR!= 1)。然后对于每一行,它用英语读取:

      数组'x'中的

    ,递增值   'x [username]'由第4个值   柱。如果数组键不存在   然而,创建它,初始化为0,和   然后通过值增加那个   第四栏。

    当Awk为每一行完成此操作时,它会运行“END”块中的代码,该块表示打印出每个用户名(x中的z)和 final 聚合值与该用户相关联(x [z]),后跟“%”。

    如果你想看到它逐行构建,你可以使用相同的基本规则,但在每行处理后而不是在'END'中添加一个打印:

    ps aux | awk 'NR != 1 {x[$1] += $4; print $1, x[$1]}'
    

答案 1 :(得分: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
}

答案 2 :(得分:1)

ps -eo user,pmem| awk 'NR>1{u[$1]+=$2}END{for(i in u)print "user: "i",mem: "u[i]}'

答案 3 :(得分: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" }
    }'