免费注册 查看新帖 |

ChinaUnix.net

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

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

论坛徽章:
0
发表于 2011-04-23 14:37 |显示全部楼层
本帖最后由 jjqing 于 2011-04-23 20:22 编辑

各位好!

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

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

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

论坛徽章:
0
发表于 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
发表于 2011-04-23 21:16 |显示全部楼层
用了那么高级的 debug 技术没发现 @checkAlert 为空? eof 因为 $fh 都读完了所以恒真。

论坛徽章:
0
发表于 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
发表于 2011-04-23 21:26 |显示全部楼层
非常感谢,我试试!

论坛徽章:
0
发表于 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
发表于 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
发表于 2011-04-23 21:38 |显示全部楼层
本帖最后由 zhlong8 于 2011-04-23 21:39 编辑

回复 7# jjqing


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

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

论坛徽章:
0
发表于 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
发表于 2011-04-23 21:56 |显示全部楼层
... 右面永远为 false 就可以了
for (@line) {
    if (// ... 0) {
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP