2010-04-16 24 views
4

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

User Total%Mem 
user1  3.4% 
user2  1.5% 

等等。

我似乎无法解决的问题是:如何知道有多少用户登录?我怎么能为他们每个人做不同的总和?

谢谢:)

回答

9

你不需要知道任何。所有您需要知道的是:

  1. 您在每一行中都有相同列数的列输出。
  2. 第一列是用户登录名。
  3. 第四列是%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”,递增该第四 列 “×[用户名]”由值的值。如果阵列密钥不存在 尚未创建它,初始化为0,然后 然后将增加第012列中的值 。

当awk中已完成此为每一行,它运行在“END”块,它说,打印出每个用户名(Z中x)的代码,以及与相关联的最终聚合值该用户(x [z]),后跟一个“%”。

如果你想看到它建一行行,你可以使用相同的基本规则,但增加了一个打印的每一行进行处理,而不是在“END”之后:

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

谢谢你真多! 我知道列表中的每个元素,但我不能将它们放在一起:D – JustB 2010-04-17 06:20:48

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