AWK 按 2 个字段分组获取平均值
AWK get avarage value with group by 2 fields
我找到了如何通过 PID 获取汇总值分组列:
iotop -botqqqk -n 10 | awk '{print ,,}'| sort -rnk 1 | awk '
{ a[] += }
END {
for (i in a) {
printf "top_10_read{pid=\"%s\",name=\"%s\"} %s\n", i, , a[i] | "sort -rnk2";
}
}
'
但我需要得到排序的平均值 "DISK READ" 按 PID 和进程名称分组。
我找到了现成的解决方案:https://github.com/ncabatoff/process-exporter/。
但我认为它没有足够的细节。我已经有一些 "messy" 脚本来导出有关进程的信息:
echo "TOP 10 CPU"
ps -A -rss -o comm,pcpu | awk -v cpus="$(nproc --all)" '
{ a[] += }
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[] += }
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[] += }
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[] += }
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[] += }
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 ,,}'| 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”。
此致
第一个解决方案:能否请您尝试以下。
your_comand | awk '{a[,]++;b[,]+=$NF} END{for(i in a){print i,b[i]/a[i]}}'
第二个解决方案:如果你想按照Input_file的第一个和第二个字段的相同顺序打印输出订购然后尝试关注。
your_command | awk 'BEGIN{SUBSEP=" "} !c[,]++{d[++count]= OFS } {a[,]++;b[,]+=$NF} END{for(i=1;i<=count;i++){print d[i],b[d[i]]/a[d[i]]}}'
编辑: 通过查看 OP 的尝试代码试图在单个 awk
本身内执行此操作,尽管根本没有测试(因为未提供命令 iotop -botqqqk -n 10
的示例输出)。
iotop -botqqqk -n 10 | awk 'BEGIN{SUBSEP=" "} !c[,]++{d[++count]= OFS } {a[,]++;b[,]+=} END{for(i=1;i<=count;i++){print d[i],b[d[i]]/a[d[i]]}}'
我找到了如何通过 PID 获取汇总值分组列:
iotop -botqqqk -n 10 | awk '{print ,,}'| sort -rnk 1 | awk '
{ a[] += }
END {
for (i in a) {
printf "top_10_read{pid=\"%s\",name=\"%s\"} %s\n", i, , a[i] | "sort -rnk2";
}
}
'
但我需要得到排序的平均值 "DISK READ" 按 PID 和进程名称分组。
我找到了现成的解决方案:https://github.com/ncabatoff/process-exporter/。 但我认为它没有足够的细节。我已经有一些 "messy" 脚本来导出有关进程的信息:
echo "TOP 10 CPU"
ps -A -rss -o comm,pcpu | awk -v cpus="$(nproc --all)" '
{ a[] += }
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[] += }
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[] += }
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[] += }
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[] += }
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 ,,}'| 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”。
此致
第一个解决方案:能否请您尝试以下。
your_comand | awk '{a[,]++;b[,]+=$NF} END{for(i in a){print i,b[i]/a[i]}}'
第二个解决方案:如果你想按照Input_file的第一个和第二个字段的相同顺序打印输出订购然后尝试关注。
your_command | awk 'BEGIN{SUBSEP=" "} !c[,]++{d[++count]= OFS } {a[,]++;b[,]+=$NF} END{for(i=1;i<=count;i++){print d[i],b[d[i]]/a[d[i]]}}'
编辑: 通过查看 OP 的尝试代码试图在单个 awk
本身内执行此操作,尽管根本没有测试(因为未提供命令 iotop -botqqqk -n 10
的示例输出)。
iotop -botqqqk -n 10 | awk 'BEGIN{SUBSEP=" "} !c[,]++{d[++count]= OFS } {a[,]++;b[,]+=} END{for(i=1;i<=count;i++){print d[i],b[d[i]]/a[d[i]]}}'