如何docker stats --no-stream
按容器前缀分组,并显示RAM和CPU以及网络和IO的总和?
如果我们认为命令的前两列docker stats --no-stream
如下所示:
CONTAINER ID NAME
9b0ef23b9c11 CompanyOneDatabase
e8bd20985752 CompanyOneAdminer
0931f3ece839 CompanyOneSite
ecbf58f6373c CompanyOneApi
61a5c5853061 CopmanyTwoDatabase
545f6f7d6f03 CopmanyTwoAdminer
28c026a8b048 CopmanyTwoSite
358a1791c233 CopmanyTwoApi
e31c842b7a35 CopmanyTwoAdminPanel
e31c842b7a35 CopmanyTwoAdminApi
我们怎样才能得到这个结果呢?
CompanyOne RAM_SUM CPU_SUM Network_SUM IO_SUM
CopmanyTwo RAM_SUM CPU_SUM Network_SUM IO_SUM
#!/bin/bash
docker stats --no-stream | awk '/CompanyOne/ {print $3, $4, $8, $11}' | xargs awk '{
for (i=2; i<=NF; i++) {
sumcols[i]+= $i; sumrows+= $i
}; print $0, sumrows
}
END { for (x in sumcols)
{ printf SEP sumcols[x]; SEP=FS };
print ""
}' infile
基本上我需要在 shell 中进行映射/减少。我怎样才能实现它?
更新:这是来自我们的 VPS 实例之一的真实样本。为了保护隐私,我们已将公司名称替换为字母:
答案1
我想出了
计数.awk:
NF == 1 {
ram[$1] = cpu[$1] = network[$1] = io[$1] = 0 ;
}
NF > 1 {
for (r in ram )
if (substr($2,1,length(r)) == r ) {
ram[r]+=$3 ; cpu[r]+=$4 ; network[r] += $8 ; io[r] += $11 ;
}
}
END { for (r in ram )
printf "%-25s %6.2f %6d %6d %6d\n",r,ram[r],cpu[r],network[r],io[r] ;
}
您需要一份公司列表(在您的样本中)
Aaaaaaaa
Bbbbbbbbbbb
Cccccccccc
Ddddddddddd
被称为
docker stats --no-stream | awk -f count.awk l -
这给了
Bbbbbbbbbbb 0.25 1071 1235 360
Aaaaaaaa 0.27 1118 2674 382
Ddddddddddd 0.23 1372 3310 432
Cccccccccc 0.24 1183 2388 1302
- 您可以调整格式字符串(“%-25s %6d %6d %6d %6d\n”)以提供更多或更少的空间。
- 如果每个公司总是有相同的集装箱清单,则可以避免手动清单。
- 正如我在评论中指出的,
docker stats
可以给定一个格式字符串 (--format=" "
),它将仅打印所需的字段。 - 根据您的语言环境,您可能需要调用 awk
LC_NUMERIC=C awk -f ...