我试图通过解析以下/ proc / stat的输出来获取在用户任务,系统任务,中断处理,io等待等方面花费的cpu时间的度量。
我的目的是检索第一行中的数值(以“ cpu”开头的数字到索引为1到N的单独数组元素中
[kcube@myPc ~]$ cat /proc/stat
cpu 70508209 48325 12341967 18807644987 671141 0 11736 0 0 0
cpu0 4350458 319 868828 1175271469 23047 0 2397 0 0 0
cpu1 3944197 277 857728 1175822236 16462 0 1025 0 0 0
cpu2 3919468 538 924717 1175628294 136617 0 2270 0 0 0
cpu3 3763268 441 855219 1175968114 43631 0 733 0 0 0
cpu4 3551196 147 856029 1176198902 18392 0 851 0 0 0
cpu5 5394823 1806 997806 1174089493 120122 0 2056 0 0 0
cpu6 3425023 656 839042 1176324091 58718 0 3 0 0 0
cpu7 3167959 189 811389 1176654383 19218 0 2 0 0 0
cpu8 4454976 5046 625657 1175714502 10447 0 26 0 0 0
cpu9 5049813 5365 655732 1175082394 10511 0 30 0 0 0
cpu10 4746872 4727 630042 1175408141 10959 0 28 0 0 0
cpu11 5367186 4684 659408 1174759103 9992 0 23 0 0 0
cpu12 4744405 5940 704282 1175177246 149934 0 714 0 0 0
cpu13 4689816 5954 650193 1175439255 13494 0 5 0 0 0
cpu14 4872185 5479 699429 1175126266 16945 0 898 0 0 0
cpu15 5066558 6748 706459 1174981089 12643 0 669 0 0 0
我有下面的awk脚本。
[kcube@myPc ~]$ cat test.awk
{
if ( match($0,/cpu\s(\s[[:digit:]]+){10}$/, ary) ) {
print ary[0]
print ary[1]
}
}
这总是给我ary [1]第一行中的最后一个数值。我正在寻找的是像:
ary[1] = 70508209
ary[2] = 48325
.
.
so on
我从未使用过间隔表达和分组在一起。我尝试搜索答案,但找不到答案。有人可以帮我吗?
我正在使用GNU Awk 4.0.2
$ cat tst.awk
match($0,/^cpu\s(\s[[:digit:]]+){10}$/,ary) {
print "bad match:", ary[1]
print "bad match:", ary[2]
}
match($0,/^cpu\s+([[:digit:]]+)\s([[:digit:]]+)\s([[:digit:]]+)\s([[:digit:]]+)\s([[:digit:]]+)\s([[:digit:]]+)\s([[:digit:]]+)\s([[:digit:]]+)\s([[:digit:]]+)\s([[:digit:]]+)$/,ary) {
print "good match:", ary[1]
print "good match:", ary[2]
}
/^cpu\s/ && split($0,tmp,/[[:digit:]]+/,ary) {
print "good split:", ary[1]
print "good split:", ary[2]
}
$ awk -f tst.awk file
bad match: 0
bad match:
good match: 70508209
good match: 48325
good split: 70508209
good split: 48325
间隔表达式定义要使正则表达式匹配必须存在的前一个表达式的重复数,仅此而已。它不是填充捕获组的一部分-完全取决于使用封闭正则表达式段的圆括号。要执行您想要的操作,您需要为每个数字定义显式捕获组,或者使用split()或类似方法根据描述要捕获的每个实体的正则表达式创建数组。
上面所有方法都使用GNU awk-第三个arg匹配()和第四个arg拆分()。请注意,您也可以使用GNU awk for FPAT来做到这一点:
$ awk -v FPAT='[0-9]+' '/^cpu /{for (i=1; i<=NF; i++) print i, $i}' file
1 70508209
2 48325
3 12341967
4 18807644987
5 671141
6 0
7 11736
8 0
9 0
10 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句