如何awk间隔表达式并将其分组在一起?

kcube

我试图通过解析以下/ 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Scala中将多个case表达式链接在一起

Java正则表达式,如何在点,空格上分割,并将引号引起的单词放在一起

如何按公共属性对对象数组进行分组并将其他属性放在一起

如何使用多个'Where'表达式,并使用C#/。NET将它们与AND和OR链接在一起?

如何将正则表达式与字符串结合在一起?

javafx:setRowFactory中的多个事件,并将匿名内部类和lambda表达式组合在一起

将正则表达式的各个部分组合在一起,以明确预期的运算符优先级

将带有多个参数的表达式合并在一起

Bash表达式与命令的返回码结合在一起

用表达式命令将两个向量粘贴在一起

Laravel:如何获取重复的记录并将它们分组在一起?

如何使用dplyr在R中按日期过滤并将月份分组在一起

如何在列表中找到相同的值并将新列表分组在一起?

如何将使用正则表达式提取的句子的所有单词组合在一起?

如何使用正则表达式将两个不带特殊字符的大写字母匹配在一起?

如何检查名称是否不包含与正则表达式连在一起的两个点?

从awk到awk的间隔表达式

如何按日期分组在一起?

如何将这些分组在一起?

我如何找到重复的公司并将其合并为一个公司并将其权重加在一起

如何检查JSON对象数组中的相同值并将其组合在一起?

将正则表达式放在一起以突出显示文本框中的单词

正则表达式:将单个字符组合在一起,只要它们是字母

将两个XPath表达式与公共前缀路径结合在一起?

正则表达式用于分割每个字符,但将数字保持在一起

python正则表达式匹配单个模式给出False,但将模式放在一起给出True?

正则表达式与列表结合在一起以数字形式表示为单词

python正则表达式将字符和数字匹配在一起

如何使用BS4从多个<span>标签提取数据并将数据分组在一起?