免费注册 查看新帖 |

Chinaunix

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

请教一个从文件中取一段范围内的文本(出错)的问题 [复制链接]

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

各位好!

我想用perl来分析Oracle的日志,大致想法是,先读出日志到一个数组,然后对这个数组做foreach,取出指定时间点以后的所有日志。
这时,取出的日志就是所需要分析的日志。

但是,我在做“取出指定时间点以后的所有日志”这个操作时,却总是只能取到两行数据,实际上应该取到的是15行,不知道是哪里出了错,请各位帮忙看看,谢谢!

附件是我所使用的oracle日志样本以及测试脚本的压缩包: alert_pl.zip (1.04 KB, 下载次数: 35)

谢谢各位!

下面是我的测试脚本:
  1. #!/bin/env perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. use Smart::Comments;

  6. #检查ORACLE告警日志
  7. my $file = "alert_PROD.log";
  8. open my $fh, '<', $file or return;
  9. my @lines = <$fh>;

  10. foreach (@lines) {
  11.     chomp;
  12. }
  13. ### @lines

  14. my @checkAlert;
  15. my @errorAlert;

  16. #从指定的时间点开始检查日志
  17. #例如,从Fri Apr 22 12:20:52 2011开始检查
  18. foreach (@lines) {
  19.     if ( /Sun Feb 27 10:33:50/ ... eof ) {
  20.         push @checkAlert , $_;
  21.     }
  22. }

  23. #如果检查范围内有ORA-开头的文本,则放到错误日志组里面
  24. foreach (@checkAlert) {
  25.     if ( /^ORA-/ ) {
  26.         push @errorAlert , $_;
  27.     }
  28. }

  29. ### @checkAlert
  30. ### @errorAlert
复制代码


以下是所分析的oracle日志的样本:
  1. Fri Aug 28 10:14:50 2009
  2. Thread 1 advanced to log sequence 147566
  3.   Current log# 3 seq# 147566 mem# 0: /oradata/PROD/redoPROD03.log
  4. Sun Feb 27 10:32:33 2011
  5. Thread 1 advanced to log sequence 204661
  6.   Current log# 3 seq# 204662 mem# 0: /oradata/PROD/redoPROD03.log
  7. Sun Feb 27 10:33:50 2011
  8. Thread 1 cannot allocate new log, sequence 204663
  9. Checkpoint not complete
  10.   Current log# 3 seq# 204662 mem# 0: /oradata/PROD/redoPROD03.log
  11. Thread 1 advanced to log sequence 204663
  12.   Current log# 4 seq# 204663 mem# 0: /oradata/PROD/redoPROD04.log
  13. Wed Mar  9 03:01:59 2011
  14. Errors in file /u03/oracle/app/oracle/admin/PROD/bdump/prod_snp0_12949.trc:
  15. ORA-12012: error on auto execute of job 14874
  16. ORA-00376: file 11 cannot be read at this time
  17. ORA-01110: data file 11: '/oradata/PROD/mrpx01.dbf'
  18. ORA-06512: at "APPS.CUST_CMP_DATA_HQPO", line 133
  19. ORA-06512: at line 1
  20. Sat Apr 23 14:08:30 2011
  21. Completed: alter database open
  22. Sat Apr 23 14:09:44 2011
  23. Thread 1 advanced to log sequence 211717
  24.   Current log# 2 seq# 211717 mem# 0: /oradata/PROD/redoPROD02.log
复制代码


以下是运行结果:
### @checkAlert: [
###                'Sun Feb 27 10:33:50 2011',
###                'Thread 1 cannot allocate new log, sequence 204663'
###              ]
### @errorAlert: []

论坛徽章:
0
2 [报告]
发表于 2011-04-23 18:40 |只看该作者
请各位大侠帮忙啊,谢谢!

就差这一点,卡在这里,过不去了!

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2011-04-23 21:16 |只看该作者
用了那么高级的 debug 技术没发现 @checkAlert 为空? eof 因为 $fh 都读完了所以恒真。

论坛徽章:
0
4 [报告]
发表于 2011-04-23 21:20 |只看该作者
呵呵,试试这个 。。。。
perl -ne 'my @array;push @array,$_ if (/Sun Feb 27 10:33:50/...eof);print grep {/^ORA-/} @array'  <log.txt

论坛徽章:
0
5 [报告]
发表于 2011-04-23 21:26 |只看该作者
非常感谢,我试试!

论坛徽章:
0
6 [报告]
发表于 2011-04-23 21:33 |只看该作者
呵呵,试试这个 。。。。
perl -ne 'my @array;push @array,$_ if (/Sun Feb 27 10:33:50/...eof);print g ...
xiaofengmanlou 发表于 2011-04-23 21:20


谢谢!用这个确实可以:
C:\Documents and Settings\Administrator\桌面>perl -ne "my @array;push @array,$_ if (/Sun Feb 27 10:33:50/...eof);print g
rep {/^ORA-/} @array"  < alert_PROD.log
ORA-12012: error on auto execute of job 14874
ORA-00376: file 11 cannot be read at this time
ORA-01110: data file 11: '/oradata/PROD/mrpx01.dbf'
ORA-06512: at "APPS.CUST_CMP_DATA_HQPO", line 133
ORA-06512: at line 1

但是我还是想问一下,当我把< alert_PROD.log,换成
my $file = "alert_PROD.log";
open my $fh, '<', $file or return;
my @lines = <$fh>;
foreach (@lines) {
    chomp;
}

my @array;
foreach ( @lines ) {
    push @array,$_ if (/Sun Feb 27 10:33:50/...eof);
}
### arrayarray

这时,array的输出,仍然只有两行:
### array: [
###          'Sun Feb 27 10:33:50 2011',
###          'Thread 1 cannot allocate new log, sequence 204663'
###        ]

请问这是怎么回事?能帮我再看看吗?
谢谢!

论坛徽章:
0
7 [报告]
发表于 2011-04-23 21:35 |只看该作者
用了那么高级的 debug 技术没发现 @checkAlert 为空? eof 因为 $fh 都读完了所以恒真。
zhlong8 发表于 2011-04-23 21:16



    对啊,@alertCheck不应该为空,它的数据来源是@lines,满足它的条件(if ( /Sun\sFeb\s27\s10:33/ ... eof )),应该有14行才对的。

但是,它怎么弄,它都只返回2行,我才为难啊!

谢谢!

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
8 [报告]
发表于 2011-04-23 21:38 |只看该作者
本帖最后由 zhlong8 于 2011-04-23 21:39 编辑

回复 7# jjqing


    你的判断条件有问题,while (<FH>) { if (// .. eof)  这样用才对啊

    有些东西你改了一点意义就完全不同了

论坛徽章:
0
9 [报告]
发表于 2011-04-23 21:50 |只看该作者
回复  jjqing


    你的判断条件有问题,while () { if (// .. eof)  这样用才对啊

    有些东西你 ...
zhlong8 发表于 2011-04-23 21:38



    谢谢!确实,用
my $file = "alert_PROD.log";
open FH, '<', $file or return;
while ( <FH> ) {
    if ( /Sun\sFeb\s27\s10:33/ ... eof ) {
        push @checkAlert , $_;
    }
    else {
        push @checkAlert2 , $_;
    }
}

这样,返回的结果就是正确的了!
非常感谢!

但是,如果我想先把文件读到一个@lines里面,然后再对@lines,取相同条件的行,这样的话,应该要怎么做,才是正确的呢?

我这样做对吗:
open my $fh, '<', $file or return;
my @lines = <$fh>;
foreach (@line) {
    chomp;
}
my @checkAlert;

#从指定的时间点开始检查日志
#例如,从Sun Feb 27 10:33:50开始检查
foreach (@lines) {
    if ( /Sun Feb 27 10:33:50/ ... eof ) {
        push @checkAlert , $_;
    }
}

谢谢!

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
10 [报告]
发表于 2011-04-23 21:56 |只看该作者
... 右面永远为 false 就可以了
for (@line) {
    if (// ... 0) {
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP