AWK获取2个字段分组的平均值

时间:2019-03-08 09:48:33

标签: bash awk metrics

我找到了如何通过PID获取汇总值分组列的方法:

iotop -botqqqk -n 10 |  awk '{print $13,$2,$5}'| sort -rnk 1  | awk '                         
  { a[$2] += $3 }
  END {
    for (i in a) {
      printf "top_10_read{pid=\"%s\",name=\"%s\"} %s\n", i, $1, a[i] | "sort -rnk2";
    }
  }               
'

但是我需要获得按PID和PROCESS NAME分组的排序平均值“ DISK READ”。

我找到了现成的解决方案:https://github.com/ncabatoff/process-exporter/。 但是我认为它没有足够的细节。我已经有一些“混乱”脚本来导出有关进程的信息:

echo "TOP 10 CPU"
ps -A -rss -o comm,pcpu | awk -v cpus="$(nproc --all)" '
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_cpu{process=\"%s\"} %s\n", i, a[i]/cpus | "sort -rnk2";
    }
  }               
' | head -n 10

echo "TOP 10 RAM"
ps -A -rss -o comm,pmem | awk '                         
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_ram{process=\"%s\"} %s\n", i, a[i] | "sort -rnk2";
    }
  }               
' | head -n 10

echo "TOP 10 RSS"
ps -A -o comm,rss | awk '
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_rss{process=\"%s\"} %s\n", i, a[i]/1024 | "sort -g -rk2,2";
    }
  }
' | head -n 10

echo "TOP 10 VSZ"
ps -A -o comm,vsz | awk '
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_vsz{process=\"%s\"} %s\n", i, a[i]/1024 | "sort -g -rk2,2";
    }
  }
' | head -n 10

echo "TOP 10 SZ"
 ps -A -o comm,sz | awk '
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_sz{process=\"%s\"} %s\n", i, a[i]/1024 | "sort -g -rk2,2";
    }
  }
' | head -n 10

而且还将获取每个进程有关TCP连接状态的信息。

您认为是这种切割刀解决方案,还是我只是在浪费时间,有一些现成的选择?

输入示例:

 #iotop -botqqqk -n 10 |  awk '{print $13,$2,$5}'| sort -rnk 1
    glusterfsd 23976 0.00
    glusterfsd 23976 0.00
    glusterfsd 23975 122.89
    glusterfsd 23975 116.36

预期输出样本:

    glusterfsd 23976 0.00
    glusterfsd 23975 119.625

其中PID 23975的平均磁盘读取值为“ 119.625”。

致谢

1 个答案:

答案 0 :(得分:1)

第一种解决方案: 。能否请您尝试以下操作。

your_comand | awk '{a[$1,$2]++;b[$1,$2]+=$NF} END{for(i in a){print i,b[i]/a[i]}}' 


第二解决方案: :如果要按Input_file的第一字段和第二字段的顺序打印输出,请尝试以下操作。

your_command | awk 'BEGIN{SUBSEP=" "} !c[$1,$2]++{d[++count]=$1 OFS $2} {a[$1,$2]++;b[$1,$2]+=$NF} END{for(i=1;i<=count;i++){print d[i],b[d[i]]/a[d[i]]}}' 


编辑: :通过查看OP的尝试代码尝试在单个awk自身中执行此操作,尽管尚未进行任何测试(因为命令{{1的示例输出) }}未提供。

iotop -botqqqk -n 10