免费注册 查看新帖 |

Chinaunix

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

根据时间点 提取目标段,求优化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-14 10:51 |只看该作者 |倒序浏览
本帖最后由 kb2008 于 2011-09-14 10:58 编辑

我自己写的
#!/bin/bash
start="2011 09 07 09 30 00"                                   ##################### 给定的起始时间
end="2011 09 07 10 00 59"                                    ##################### 给定结束时间

awk -F '[-: ]+' -v s="$start"  '{ if ( $1~/ERROR/ && mktime($2" "$3" "$4" "$5" "$6" "substr($7,1,2))
>=mktime(s)) print NR
}' catalina.out  > tmp1
awk -F '[-: ]+' -v e="$end"  '{ if ( $1~/ERROR/ && mktime(e)>=mktime($2" "$3" "$4" "$5" "$6"
"substr($7,1,2)))  print NR }
' catalina.out  > tmp2
t1=`head -n 1  tmp1`
t2=`tail  -n 1  tmp2`
sed -n ''$t1','$t2'p' catalina.out                                   
rm -rm tmp1
rm -rm tmp2


我这个catalina.out有  5G ,使用上面的脚本 大概需要40分钟左右,我希望优化后能在 2分钟左右   ,谢谢




我自己又改了一下,也要花30分钟
  1. #!/bin/bash

  2. start="2011 09 07 09 30 00"
  3. end="2011 09 07 10 00 59"
  4. num_list=`cat catalina.out | wc -l `

  5. awk -F '[-: ]+' -v s="$start"  '$1~/ERROR/ && mktime($2" "$3" "$4" "$5" "$6" "substr($7,1,2))>=mktime(s){ print NR;exit  }
  6. ' catalina.out  > tmp1

  7. tac catalina.out |  awk -F '[-: ]+' -v e="$end"  '$1~/ERROR/ && mktime(e)>=mktime($2" "$3" "$4" "$5" "$6" "substr($7,1,2))
  8. {  print NR;exit }'   > tmp2

  9. t1=`cat  tmp1`
  10. t2=`cat  tmp2`
  11. t3=`expr $num_list - $t2`
  12. sed -n ''$t1','$t3'p' catalina.out

  13. rm -rf  tmp1
  14. rm -rf tmp2
复制代码
部分 目标文件
  1. ERROR 2011-08-01 14:00:51.868 [Thread-20] - Send mail fault
  2. org.apache.commons.mail.EmailException: Sending the email to the following server failed : mail.askul.com.cn:25
  3.         at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1138)
  4.         at org.apache.commons.mail.Email.send(Email.java:1163)
  5.         at com.easier.common.biz.email.EmailQueue.exec(EmailQueue.java:22)
  6.         at com.easier.common.model.queues.AbstractQueue.execute(AbstractQueue.java:79)
  7.         at com.easier.common.model.queues.AbstractQueue.run(AbstractQueue.java:102)
  8.         at java.lang.Thread.run(Thread.java:595)
  9. Caused by: javax.mail.SendFailedException: Invalid Addresses;
  10.   nested exception is:
  11.         com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 <jqli@askul.com.cn>: Recipient address rejected: User unkn
  12. own

  13.         at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1196)
  14.         at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:584)
  15.         at javax.mail.Transport.send0(Transport.java:169)
  16.         at javax.mail.Transport.send(Transport.java:98)
  17.         at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1128)
  18.         ... 5 more
  19. Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 <jqli@askul.com.cn>: Recipient address rejected: User u
  20. nknown

  21.         at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1047)
  22.         ... 9 more







  23. ERROR 2011-08-01 14:52:21.223 [Thread-20] - Send mail fault
  24. org.apache.commons.mail.EmailException: Sending the email to the following server failed : mail.askul.com.cn:25
  25.         at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1138)
  26.         at org.apache.commons.mail.Email.send(Email.java:1163)
  27.         at com.easier.common.biz.email.EmailQueue.exec(EmailQueue.java:22)
  28.         at com.easier.common.model.queues.AbstractQueue.execute(AbstractQueue.java:79)
  29.         at com.easier.common.model.queues.AbstractQueue.run(AbstractQueue.java:102)
  30.         at java.lang.Thread.run(Thread.java:595)
  31. Caused by: javax.mail.SendFailedException: Invalid Addresses;
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
2 [报告]
发表于 2011-09-14 10:59 |只看该作者
可否看看你原始文件内容?提供几行作参考!

论坛徽章:
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 [报告]
发表于 2011-09-14 11:07 |只看该作者
我自己写的
#!/bin/bash
start="2011 09 07 09 30 00"                                   ############ ...
kb2008 发表于 2011-09-14 10:51



>>我这个catalina.out有  5G ,使用上面的脚本 大概需要40分钟左右,我希望优化后能在 2分钟左右   ,谢谢

先测...有没有可能...
time awk -F '[-: ]+' -v s="$start"  '$1~/ERROR/{a=NF}' catalina.out
time awk -F '[-: ]+' '{a=NF}' catalina.out
如果都不能在2分钟内,完成....换个方法吧!!!

论坛徽章:
0
4 [报告]
发表于 2011-09-14 11:11 |只看该作者
回复 3# jason680


    换什么方法呢,能给个思路吗,谢谢
  我必须要用 时间点来取的

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
5 [报告]
发表于 2011-09-14 11:17 |只看该作者
  1. #!/bin/bash
  2. start_time="2011-09-07 09:30:00.000"
  3. end_time="2011-09-07 10:00:59.000"
  4. log_file=catalina.out
  5. grep -E "^ERROR" $log_file | awk -v start_time=$start_time -v end_time=$end_time '{curr_time=$2" "$3; if (curr_time>=start_time && curr_time<=end_time) print $0}'

复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
6 [报告]
发表于 2011-09-14 11:23 |只看该作者
建议你先运行一下
  1. grep -E "^ERROR" catalina.out
复制代码
如果这个都要超过2分钟,再怎么优化也是白搭!

论坛徽章:
0
7 [报告]
发表于 2011-09-14 11:24 |只看该作者
本帖最后由 kb2008 于 2011-09-14 11:28 编辑

回复 6# damcool


   start="2011 09 07 09 30 00"; awk '$1~/ERROR/{ print $0} ' catalina.out |  awk -F '[-: ]+'      'mktime($2" "$3" "$4" "$5" "$6" "substr($7,1,2))>=mktime("2011 09 07 "09" "00" "00)&&mktime($2" "$3" "$4" "$5" "$6" "substr($7,1,2))<=mktime("2011 09 07 "10" "10" "00)'   

这个 在 2分钟左右的


另外,你的只能 打印 符合条件的 目标行,而不是 目标行之间的段,你的就和我上面的是一样的

论坛徽章:
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
8 [报告]
发表于 2011-09-14 11:30 |只看该作者
回复  jason680


    换什么方法呢,能给个思路吗,谢谢
  我必须要用 时间点来取的
kb2008 发表于 2011-09-14 11:11


C language

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
9 [报告]
发表于 2011-09-14 11:34 |只看该作者
回复  damcool


   start="2011 09 07 09 30 00"; awk '$1~/ERROR/{ print $0} ' catalina.out |  awk ...
kb2008 发表于 2011-09-14 11:24



    问一下
1、你的数据是不是都是错误数据?例如
ERROR 2011-09-12 10:10:10.000 [xxxx]
xxxx...
yyyy.....

ERROR 2011-09-12 10:11:10.000 [xxxx]
xxxx...
yyyy.....

2、每段数据开始是不是有统一规则?

论坛徽章:
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
10 [报告]
发表于 2011-09-14 11:57 |只看该作者
本帖最后由 jason680 于 2011-09-14 11:58 编辑
回复  jason680


    换什么方法呢,能给个思路吗,谢谢
  我必须要用 时间点来取的
kb2008 发表于 2011-09-14 11:11



start="2011 09 07 09 30 00"
end="2011 09 07 10 00 59"   
1. 如果​​日期都一样....
只要计算时间...这样不须要mktime应该可以再快一点...

2. 就算要用mktime,也不要一直用(重复)
awk -F '[-: ]+' 'mktime($2" "$3" "$4" "$5" "$6" "substr($7,1,2))>=mktime("2011 09 07 "09" "00 " "00)&&mktime($2" "$3" "$4" "$5" "$6" "substr($7,1,2))<=mktime("2011 09 07 "10" "10" "00)'

==改==============
BEGIN{s=mktime("2011 09 07 "09" "00" "00); e=mktime("2011 09 07 "10" "10" "00)}
{t=mktime($2" "$3" "$4" "$5" "$6" "substr($7,1,2)); if(t >=s && t <=e)...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP