免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2539 | 回复: 10
打印 上一主题 下一主题

急,请高人们帮我看看这个AWK脚本! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-28 17:48 |只看该作者 |倒序浏览
我有一个要分析的文件,如下:

各模块CPU占用率

---------------

   模块号     CPU占用状况



       0      30%,正常

       1      28%,正常

       2      26%,正常

       3      25%,正常

       4      21%,正常

       5      33%,正常

       6      22%,正常

       7      27%,正常

       8      27%,正常

       9      26%,正常

      10      05%,正常

(结果个数 = 11)



---    END
检查时间是:   2008-01-28 13:17:00

我想用AWK分析这个文件,把里面的时间(最后一行)提取出来,放到这个文件的第一列,模块号和cpu占用状况下的具体数值都提取出来形成一个新的文件,格式如下:
2008-01-28 13:17:00|0|30|正常
2008-01-28 13:17:00|1|28|正常
2008-01-28 13:17:00|2|26|正常
2008-01-28 13:17:00|3|25|正常
2008-01-28 13:17:00|4|21|正常
2008-01-28 13:17:00|5|33|正常
2008-01-28 13:17:00|6|22|正常
2008-01-28 13:17:00|7|27|正常
2008-01-28 13:17:00|8|27|正常
2008-01-28 13:17:00|9|26|正常
2008-01-28 13:17:00|10|05|正常


写了一个脚本:

BEGIN {
}

index($0,"各模块CPU占用率")

        {
        dn =0           #模块号
        baifenbi =0   #百分比
       
while(readline())
        {
                if(index($0,"---    END"))
                {
                break;
    }
  else if($NF=="CPU占用状况" && NF==2)
    while(readline())
                {       
  if(index($0,"(结果个数"))
                {
                break;
    }
  dn =$1
        baifenbi=$2
        split(baifenbi,u,",");
        x1=u[1]
  x2=u[2]
  split(x1,z,"%");
  y=z[1]

        print dn"|"y"|"x2
                }               
}
}

END{
}       
可以分析出这样的结果,可是时间不知道如何取出,请问高手如何处理,谢谢!
1|28|正常
2|26|正常
3|25|正常
4|21|正常
5|33|正常
6|22|正常
7|27|正常
8|27|正常
9|26|正常
10|05|正常

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2008-01-28 17:58 |只看该作者
awk '$1~/^[0-9]+$/{sub(/,/,"|",$2);a[$1"|"$2]++}/^检查时间/{b=$2" "$3}END{for(i in a) print b"|"i}' urfile

论坛徽章:
0
3 [报告]
发表于 2008-01-28 18:15 |只看该作者

回复 #2 ly5066113 的帖子

老大,看看能在我写的脚本上想想办法吗?

论坛徽章:
0
4 [报告]
发表于 2008-01-28 18:16 |只看该作者

  1. awk 'BEGIN{FS="[| ]+"}
  2. /各模块CPU占用/{
  3. while( getline > 0 ){
  4.         if($0~/检查时间是/){
  5.                 dstr=$2" "$3
  6.                 for(i=0;i<=10;i++) print dstr a[i]
  7.                 break
  8.         }
  9.         if($0~/^[[:blank:]]*[0-9]/){
  10.                 gsub(/[[:blank:]]+/,"|")
  11.                 sub(/%,/,"|")
  12.                 a[$2]=$0
  13.         }
  14. }
  15. }'  数据文件
复制代码

论坛徽章:
0
5 [报告]
发表于 2008-01-29 09:04 |只看该作者

回复 #1 gcllk 的帖子

高人的回答真是让我眼界大开呀

论坛徽章:
0
6 [报告]
发表于 2008-01-29 09:38 |只看该作者
awk 'BEGIN{FS="[| ]+"}
/各模块CPU占用/{
while( getline > 0 ){
        if($0~/检查时间是/){
                dstr=$2" "$3
                for(i=0;i<=10;i++) print dstr a
                break
        }
        if($0~/^[[:blank:]]*[0-9]/){
                gsub(/[[:blank:]]+/,"|")
                sub(/%,/,"|")
                a[$2]=$0
        }
}
}'  数据文件


还有一个问题,就是我要分析的文件中模块号是不固定的,可能有10个模块,也可能有20个,这就导致
for(i=0;i<=10;i++) print dstr a
这个语句有问题,请问怎么在这个基础上改呢,谢了!

论坛徽章:
0
7 [报告]
发表于 2008-01-29 09:54 |只看该作者

回复 #1 gcllk 的帖子

急啊,请高手帮忙看看

论坛徽章:
0
8 [报告]
发表于 2008-01-29 10:05 |只看该作者
原帖由 gcllk 于 2008-1-29 09:38 发表


还有一个问题,就是我要分析的文件中模块号是不固定的,可能有10个模块,也可能有20个,这就导致
for(i=0;i

如果检查时间总是文件的最后一行,那么直接使用下面的代码,缺点是顺序会乱,不会从模块1-n 排列
  1. for (i in a) print destr a[i]
复制代码

如果要顺序显示,那么可以考虑通过“(结果个数 = 11)”这个行来获得模块数,然后循环打印

[ 本帖最后由 jinl 于 2008-1-29 10:08 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-01-29 10:42 |只看该作者
再附上一个我的代码:

  1. BEGIN {FS="[ %(),=]+"}
  2. $2 ~ /[0-9]+/ && $1 !~ /检查/ {a[$2]=$2"|"$3"|"$4}
  3. /结果个数/ {mod_number=$3}
  4. /检查时间/ {u_time=$2" "$3}
  5. END {
  6. for (i=0;i<mod_number;i++) print u_time "|" a[i];
  7. }
复制代码

[ 本帖最后由 jinl 于 2008-1-29 10:45 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-01-29 10:52 |只看该作者

  1. awk 'BEGIN{FS="[| ]+"}
  2. /各模块CPU占用/{
  3. max=0
  4. while( getline > 0 ){
  5.         if($0~/检查时间是/){
  6.                 dstr=$2" "$3
  7.                 for(i=0;i<=max;i++)if(a[i]) print dstr a[i]
  8.                 break
  9.         }
  10.         if($0~/^[[:blank:]]*[0-9]/){
  11.                 gsub(/[[:blank:]]+/,"|")
  12.                 sub(/%,/,"|")
  13.                 a[$2]=$0
  14.                 max=(max<$2)?$2:max
  15.         }
  16. }
  17. }' 数据文件
复制代码


思路是出现一个模块记录的时候,就将max(用来记录最大值)设置为0,然后每次匹配到序号的时候,就把max设置为最大的序号。
if(a) print dstr a 是防止出现序号间断的时候,会只打印日期。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP