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

时间:2018-08-31 16:33:38

标签: awk

我试图通过解析/ proc / stat的以下输出来计算在用户任务,系统任务,中断处理,io等待等方面花费的cpu时间。

我的目的是检索第一行中的数值(以“ cpu”开头的数字到从1到N索引的单独数组元素中

@Override
protected void onDestroy() {
    Intent intent = new Intent();
    intent.setComponent(new ComponentName("com.home.androiddemo", "com.home.androiddemo.MainActivity"));
    intent.setAction("custom.android");
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    // TODO pass necessary outcome

    super.onDestroy();
}

我有下面的awk脚本。

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="custom.action" />
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

这总是给我ary [1]第一行中的最后一个数字值。 我正在寻找的是像这样的东西:

[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

我从未使用过间隔表达式和分组在一起。我尝试搜索答案,但找不到答案。有人可以帮我吗?

我正在使用GNU Awk 4.0.2

2 个答案:

答案 0 :(得分:0)

欢迎来到SO,不确定您的完整目标是什么。如果要获取从字符串cpu开始的每一行的元素并从现在开始打印它们,则也可以根据需要使用它们。

awk '
/^cpu/{
  array1[FNR]=$1
  for(i=2;i<=NF;i++){
    array[FNR,i]=$i
  }
}
END{
  for(j=1;j<=FNR;j++){
    for(k=1;k<=NF;k++){
      print array1[j],array[k,k]
    }
  }
}'  Input_file

答案 1 :(得分:0)

$ 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