我有命令按内存使用情况列出系统进程:
ps -A --sort -rss -o comm,pmem
其中列出了一个类似的表
COMMAND %MEM
firefox 28.2
chrome 5.4
compiz 4.8
atom 2.5
chrome 2.3
Xorg 2.3
skype 2.2
chrome 2.0
chrome 1.9
atom 1.9
nautilus 1.8
hud-service 1.5
evince 1.3
我想获得每个程序的总内存共享,而不是相同程序的每个进程。所以我可以获得像这样的输出
COMMAND %MEM
firefox 28.2
chrome 11.6
compiz 4.8
atom 4.4
Xorg 2.3
skype 2.2
nautilus 1.8
hud-service 1.5
evince 1.3
我想过使用awk
,但我不太了解。最终得到类似的结果:
ps -A --sort -rss -o comm,pmem | awk -F "\t" '
{processes[$0] += $1;}
{End
for(i in processes) {
print i,"\t",processes[i];
}
}'
但这没有用。
我该如何纠正这个问题?
答案1
processes[$0] += $1;
使用整行作为关联数组中的键,这不是唯一的。您必须使用$1
,即命令名称作为键。
尝试:
$ ps -A --sort -rss -o comm,pmem | awk '
NR == 1 { print; next }
{ a[$1] += $2 }
END {
for (i in a) {
printf "%-15s\t%s\n", i, a[i];
}
}
'
如果您想按第二个字段对输出进行排序,请尝试:
$ ps -A --sort -rss -o comm,pmem | awk '
NR == 1 { print; next }
{ a[$1] += $2 }
END {
for (i in a) {
printf "%-15s\t%s\n", i, a[i] | "sort -rnk2";
}
}
'
答案2
cuonglm 答案解决了您的拼写错误,以获取其中的值上升顺序(如您的评论中所要求的),通过管道输出(在第二个字段( )上sort -n -k 2
排序为数字(),在更改打印语句以输出浮点数后,如您的示例所示:-n
-k 2
$ ps -A --sort -rss -o comm,pmem | awk '
NR == 1 { print; next }
{ a[$1] += $2 }
END {
for (i in a) {
printf "%-15s\t%.1f\n", i, a[i];
}
}
' | sed 's/%MEM/-1MEM/' | sort -n -k 2 | sed 's/-1MEM/%MEM/'
输出(使用您的表作为输入,而不是ps
在我的系统上执行):
COMMAND %MEM
evince 1.3
hud-service 1.5
nautilus 1.8
skype 2.2
Xorg 2.3
atom 4.4
compiz 4.8
chrome 11.6
firefox 28.2
或者,您可以通过此 python 程序管道输出(如果您想要降序排序(如您的示例中所示),请将其更改reverse=False
为reverse=True
:
#! /usr/bin/env python
# coding: utf-8
import sys
import operator
d = {}
for line in sys.stdin:
try:
name, val = line.split()
val = float(val)
d.setdefault(name, [0.0])[0] += val
except ValueError:
print line,
for x in sorted(d.items(), reverse=False, key=operator.itemgetter(1)):
print "{:16s}{:>4}".format(x[0], x[1][0])