我必须使用 awk 解决一个练习。基本上我需要从“ps aux”命令中检索每个用户的内存使用总量和格式,如下所示:
User Total%Mem
user1 3.4%
user2 1.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]}'
您将使用关联数组来累积每个用户的内存使用量。您不需要知道有多少用户,因为您可以遍历数组。你为什么不展示你到目前为止所拥有的东西?
这是这样的程序将具有的基本结构,用伪代码表示:
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
}
ps -eo user,pmem| awk 'NR>1{u[$1]+=$2}END{for(i in u)print "user: "i",mem: "u[i]}'
格式良好,从最高消费者排序,列号变量
设置 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" }
}'