免费注册 查看新帖 |

Chinaunix

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

[文本处理] 文本处理求助-任务耗时计算 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-12-20 21:53 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2017-12-21 11:25 编辑

大家好!
我有一个问题向大家请教。

有下面一个文本,是一个任务列表,希望从中抓取出所有状态为正在进行的任务(<status>inProgress</status>),并显示出任务名(<taskName>和</taskName>中间的部分),任务起始时间(<startTime>和</startTime>中间的部分),并计算出任务耗时(=当前时间-任务起始时间),然后按任务耗时长短分类显示任务。

  1. <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"><SOAP:Header><header xmlns="xmlapi_1.0"><requestID>:0:1</requestID><requestTime>Dec 20, 2017 8:59:58 PM</requestTime><responseTime>Dec 20, 2017 8:59:58 PM</responseTime></header></SOAP:Header><SOAP:Body><findResponse xmlns="xmlapi_1.0"><result><taskmgmt.TaskTracker><userName>admin</userName><stage>entry</stage><identifier>0.0.0.0</identifier><sessionId>3</sessionId><clientId>3</clientId><requestId>42013</requestId><taskName>Database Manager [Full Backup]</taskName><status>inProgress</status><startTime>1513774424757</startTime><elapsedTime>0</elapsedTime><queuedTime>2</queuedTime><cancelAreq><taskmgmt.CancelAreq><className>N/A</className><methodName>N/A</methodName><paramType></paramType><paramValue></paramValue></taskmgmt.CancelAreq></cancelAreq><activityId>824670356</activityId><deploymentState>-1</deploymentState><objectFullName>nmsSystem:task-tracker-manager:taskTracker-1510</objectFullName><name>Task</name><selfAlarmed>false</selfAlarmed></taskmgmt.TaskTracker><taskmgmt.TaskTracker><userName>admin</userName><stage>entry</stage><identifier>0.0.0.0</identifier><sessionId>3</sessionId><clientId>3</clientId><requestId>42241</requestId><taskName>Network Element R108 10.0.0.8 R105 10.0.0.103 [Multi Resync All MIBs]</taskName><status>inProgress</status><startTime>1513774791674</startTime><elapsedTime>0</elapsedTime><queuedTime>1</queuedTime><cancelAreq><taskmgmt.CancelAreq><className>N/A</className><methodName>N/A</methodName><paramType></paramType><paramValue></paramValue></taskmgmt.CancelAreq></cancelAreq><activityId>824670360</activityId><deploymentState>-1</deploymentState><objectFullName>nmsSystem:task-tracker-manager:taskTracker-1514</objectFullName><name>Task</name><selfAlarmed>false</selfAlarmed></taskmgmt.TaskTracker><taskmgmt.TaskTracker><userName>admin</userName><stage>entry</stage><identifier>0.0.0.0</identifier><sessionId>0</sessionId><clientId>:0:1</clientId><requestId>:0:1</requestId><taskName>Find [taskmgmt.TaskTracker]</taskName><status>succeeded</status><startTime>1513774798376</startTime><elapsedTime>2</elapsedTime><queuedTime>0</queuedTime><cancelAreq><taskmgmt.CancelAreq><className>N/A</className><methodName>N/A</methodName><paramType></paramType><paramValue></paramValue></taskmgmt.CancelAreq></cancelAreq><activityId>0</activityId><deploymentState>-1</deploymentState><objectFullName>nmsSystem:task-tracker-manager:taskTracker-1520</objectFullName><name>Task</name><selfAlarmed>false</selfAlarmed></taskmgmt.TaskTracker></result></findResponse></SOAP:Body></SOAP:Envelope>
复制代码


这个文本中有3个任务:
          <taskName>Database Manager [Full Backup]</taskName>
          <status>inProgress</status>
          <startTime>1513774424757</startTime>
--
          <taskName>Network Element R108 10.0.0.8 R105 10.0.0.103 [Multi Resync All MIBs]</taskName>
          <status>inProgress</status>
          <startTime>1513774791674</startTime>
--
          <taskName>Find [taskmgmt.TaskTracker]</taskName>
          <status>succeeded</status>
          <startTime>1513774798376</startTime>

首先取"Find [taskmgmt.TaskTracker]"任务(该任务有且仅有一个)的开始时间定为当前时间,即
<taskName>Find [taskmgmt.TaskTracker]</taskName><status>succeeded</status>后面的<startTime>1513774798376</startTime>为当前时间;
CurrentTime=1513774798376

然后取其他所有状态为inProgress的任务的taskName和startTime,并计算出任务耗时:
Database Manager [Full Backup]: (1513774798376-1513774424757=373619ms=6.23m)
Network Element R108 10.0.0.8 R105 10.0.0.103 [Multi Resync All MIBs]: (1513774798376-1513774791674=6702ms=0.11m)

如果任务耗时不到5分钟,则显示INFO;
如果任务耗时超过5分钟,则显示WARNING;
如果任务耗时超过10分钟,则显示MAJOR;
如果任务耗时超过30分钟,则显示CRITICAL;

以上文本经过awk处理后希望得到的结果是:


WARNING: TASK - Database Manager [Full Backup] has taken 6.23 minutes
INFO: TASK - Network Element R108 10.0.0.8 R105 10.0.0.103 [Multi Resync All MIBs] has taken 0.11 minutes
INFO: TASK - Find [taskmgmt.TaskTracker] has taken 0 minutes


论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
2 [报告]
发表于 2017-12-21 11:10 |只看该作者
本帖最后由 bikkuri 于 2017-12-21 11:30 编辑

[root@dhp9:/tmp]# cat tasktracker_20171220_205957.out.txt |awk -F "[<>]+" '{j=1;for(i=1;i<=NF;i++){if($i=="/taskName"){N[j]=$(i-1);if($(i-1)=="Find [taskmgmt.TaskTracker]")k=j;};if($i=="/status")S[j]=$(i-1);if($i=="/startTime")T[j]=$(i-1);if($i=="/taskmgmt.TaskTracker")j++}}END{C=T[k];for(m=1;m<j;m++){U[m]=(C-T[m])/60000;if(U[m]<5){E[m]="INFO"}else{if(U[m]<10){E[m]="WARNING"}else{if(U[m]<30){E[m]="MAJOR"}else{E[m]="CRITICAL"}}}};for(n=1;n<j;n++)printf("%s: TASK - %s has taken %.2f minutes\n",E[n],N[n],U[n])}'
WARNING: TASK - Database Manager [Full Backup] has taken 6.23 minutes
INFO: TASK - Network Element R108 10.0.0.8 R105 10.0.0.103 [Multi Resync All MIBs] has taken 0.11 minutes
INFO: TASK - Find [taskmgmt.TaskTracker] has taken 0.00 minutes
[root@dhp9:/tmp]#

task_monitor.png (21.54 KB, 下载次数: 18)

task_monitor.png

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2017-12-21 12:11 |只看该作者
回复 2# bikkuri

How about this way ...

$ awk -f get_task.awk FILE
WARNING:   TASK - Database Manager [Full Backup] has taken 6.23 minutes
INFO:      TASK - Network Element R108 10.0.0.8 R105 10.0.0.103 [Multi Resync All MIBs] has taken 0.11 minutes


$ cat get_task.awk

BEGIN{
  FS = "[<>]+"
  t=split("INFO 5 WARNING 10 MAJOR 30 CRITICAL",a," ");
  for(n=1;n<=t/2;++n){
    c=n*2
    aNum[n] = a[c]
    aMsg[n] = a[c-1]
  }
  aMsg[n] = a[t]
  sMsg = n
}
function show(n, c,t){
  msg = ""
  # for minutes
  t = (E[now] - E[n])/60000

  for(c=1;c < sMsg; ++c){
    if(t < aNum[c]){
      msg = aMsg[c]
      break
    }
  }
  if(msg == "") msg = aMsg[c]

  printf("%*s TASK - %s has taken %.2f minutes\n",-10,msg":",N[n],t)
}
{
  c=0;
  for(n=1;n<=NF;++n){
    if($n=="taskName"){
      N[++c]=$(n+1);
      #print "c="c,N[c]
      if($(n+1)~/taskmgmt.TaskTracker/)
       now=c;
      continue;
    }
    if($n=="status"){
      S[c]=$(n+1);
      continue;
    }
    if($n=="startTime"){
     E[c] = $(n+1);
    }
  }
}


END{
  for(n=1;n<=c;++n){
    #print "n=",n,N[n],S[n],E[n]
    if(S[n]=="inProgress" && n!=now)
      show(n);
  }
}

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
4 [报告]
发表于 2017-12-21 12:19 |只看该作者
回复 1# bikkuri


  1. awk -vRS='<taskName>|</startTime>' -F ">|<" '/Find \[taskmgmt.TaskTracker]/{t=$NF;}$1{a[$1]=$NF}END{for(i in a) {s=sprintf ("%.2f",(t-a[i])/60000);h=" has taken ";k=" :TASK -";m=" minutes";if(s>5) print "WARNING"k i h s m;else if(s>10) print "MAJOR"k i h s m; else if(s>30) print "CRITICAL"k i h s m;else print "INFO"k i h s m}}' file
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
5 [报告]
发表于 2017-12-21 12:30 |只看该作者
谢谢两位高手指点!学习了!

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
6 [报告]
发表于 2017-12-21 13:44 |只看该作者
这么复杂的结果,建议用 perl 或 python 吧。 shell script 不容易维护。

论坛徽章:
0
7 [报告]
发表于 2017-12-22 10:57 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
8 [报告]
发表于 2017-12-24 17:03 |只看该作者
回复 1# bikkuri


  1. awk -F"><|>|</" '{y="<taskName>Find \\[taskmgmt.TaskTracker]</taskName><status>succeeded</status><startTime>([0-9]+)</startTime>";match($0,y,t);for(i=1;i<=NF;i++){if($i~/inProgress|succeeded/){name=$(i-3);time=(t[1]-$(i+3))/1000/60;if(time<5){msg="INFO"}else if(time>=5&&time<10){msg="WARNING"}else if(time>=10&&time<30){msg="MAJOR"}else{msg="CRITICAL"};printf("%s: TASK - %s has taken %.2f minutes\n",msg,name,time)}}}' file
复制代码

输出:
WARNING: TASK - Database Manager [Full Backup] has taken 6.23 minutes
INFO: TASK - Network Element R108 10.0.0.8 R105 10.0.0.103 [Multi Resync All MIBs] has taken 0.11 minutes
INFO: TASK - Find [taskmgmt.TaskTracker] has taken 0.00 minutes

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
9 [报告]
发表于 2018-05-06 10:44 |只看该作者
回复 5# bikkuri

彩色字符是咋回事

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
10 [报告]
发表于 2018-05-08 23:54 |只看该作者
回复 9# 1cpuer

MobaXterm默认自动扫描文本中的敏感词提醒
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP