忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1497 | 回复: 9

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

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-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:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 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


论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-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:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 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_result.png
task_monitor.png

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期: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
发表于 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);
  }
}

论坛徽章:
29
酉鸡
日期:2014-05-04 10:03:482015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯纪念徽章
日期: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:09
发表于 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
复制代码

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-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:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-12-21 12:30 |显示全部楼层
谢谢两位高手指点!学习了!

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17射手座
日期:2014-09-03 16:01:17天蝎座
日期:2014-08-21 17:18:48丑牛
日期:2014-08-29 16:06:45天秤座
日期:2014-08-29 10:12:18天秤座
日期:2014-08-26 16:18:20双子座
日期:2014-07-30 11:38:27寅虎
日期:2014-08-04 10:24:12IT运维版块每日发帖之星
日期: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
发表于 2017-12-21 13:44 |显示全部楼层
这么复杂的结果,建议用 perl 或 python 吧。 shell script 不容易维护。

论坛徽章:
0
发表于 2017-12-22 10:57 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-12-22 13:37 编辑
  1. #region 用户输入部分
  2. $输入文件名 = "a:\pscode\0\xml\20171221.xml"
  3. #endregion 用户输入部分


  4. #region 脚本初始化部分
  5. function 根据时间大小返回字符串($输入时间)
  6. {
  7.         switch ($输入时间)
  8.         {
  9.                 {$输入时间 -gt 30}        {return 'CRITICAL' ; break}
  10.                 {$输入时间 -gt 10}  {return 'MAJOR' ; break  }
  11.                 {$输入时间 -gt 5}         {return 'WARNING' ; break }
  12.                 default { return 'INFO' ; break}
  13.         }
  14. }
  15. #endregion 脚本初始化部分


  16. #region main
  17. [xml]$temp = (select-xml -Path $输入文件名 -XPath "/").node
  18. $节点 = $temp.Envelope.Body.findResponse.result.'taskmgmt.TaskTracker'
  19. $2 = $节点[0].taskName
  20. $3 = $节点[1].taskName
  21. $4 = $节点[2].taskName

  22. $5 = ($节点[2].startTime - $节点[0].startTime) / 60 / 1000
  23. $6 = ($节点[2].startTime - $节点[1].startTime) / 60 / 1000

  24. $0 = 根据时间大小返回字符串  $5
  25. $1 = 根据时间大小返回字符串  $6

  26. $输出 =
  27. @"
  28. {0}: TASK - {2} has taken {5:n2} minutes
  29. {1}: TASK - {3} has taken {6:n2} minutes
  30. INFO: TASK - {4} has taken 0 minutes
  31. "@
  32. $输出 -f $0,$1,$2,$3,$4,$5,$6
  33. #endregion main

复制代码


输出:
CRITICAL: 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

问:目前哪些版本linux能安装上powershell?
答:
◦Windows 10 IoT Core(arm32的cpu,本质上是win,树莓派硬件上的win10)
◦Raspbian Stretch(arm32的cpu,树莓派官方操作系统Raspbian,基于大便,所以叫树莓便。从powershell 6 rc版开始支持)

安装方法:
https://github.com/PowerShell/PowerShell/blob/master/docs/installation/linux.md

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之同曦
日期:2017-09-11 14:39:482016科比退役纪念章
日期:2018-01-19 12:45:59CU十四周年纪念徽章
日期:2018-03-16 13:09:5315-16赛季CBA联赛之北京
日期:2018-03-23 15:24:0715-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:42CU十四周年纪念徽章
日期:2018-05-15 11:36:38
发表于 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
发表于 2018-05-06 10:44 |显示全部楼层
回复 5# bikkuri

彩色字符是咋回事

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-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:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2018-05-08 23:54 |显示全部楼层
回复 9# 1cpuer

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

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP