如何按容器名称前缀对 docker 统计信息进行分组?

如何按容器名称前缀对 docker 统计信息进行分组?

如何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

这个问题awk我想出了这个脚本,但它不起作用:

#!/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 实例之一的真实样本。为了保护隐私,我们已将公司名称替换​​为字母:

https://textuploader.com/tdftd

答案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=" "),它将仅打印所需的字段。
  • 根据您的语言环境,您可能需要调用 awkLC_NUMERIC=C awk -f ...

相关内容