我必须使用awk解决练习。基本上我需要从'ps aux'命令检索每个用户的内存使用总量和格式,如下所示:
User Total%Mem
user1 3.4%
user2 1.5%
等等。
我似乎无法解决的问题是:我如何知道有多少用户登录?我怎样才能为每一个做出不同的总和呢?
谢谢:)
答案 0 :(得分:9)
你不需要知道任何这些。您需要知道的是:
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,和 然后通过值增加那个 第四栏。
当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" }
}'