Chinaunix

标题: windows下如何用Perl从日志中截取最后一个命令的返回结果 [打印本页]

作者: tramplzh    时间: 2010-11-26 12:01
标题: windows下如何用Perl从日志中截取最后一个命令的返回结果
问题1:所有命令的执行结果都存在一个txt格式的日志文件中,格式如下
$show alarm
aaaaaaaaa
bbbbbbbbb
cccccccccccc
$show config
ddddddddd
eeeeeeeeee
fffffffffffffffffff
$show alarm
gggggggggggg
hhhhhhhhhhhh
iiiiiiiiiiiiiiiii
$
要求从文件中提取命令最后一次出现到出现下一个提示符之间部分的文本
如上,如果要求返回show alarm命令的执行结果,则结果内容应该为:
gggggggggggg
hhhhhhhhhhhh
iiiiiiiiiiiiiiiii
请问该怎么做。
特别说明,因为文件很大,所以不打算采用逐行读取文件遍历的方法,是否有其他通过正则表达式实现的方法,还请高手赐教
问题2:如何取出文件最后一行的内容(不能是逐行遍历法)
以上两个问题都是windows环境下的perl实现
非常感谢
作者: bzdghdn    时间: 2010-11-26 12:30
本帖最后由 bzdghdn 于 2010-11-26 12:34 编辑

第二个问题:
    建议看看File::ReadBackwards或者File::Bidirectional
第一个问题:
    用 File::ReadBackwards从日志文件末尾往前读,读到某个命令在程序中第一次出现应该就是它在文件中最后一次出现
作者: iamlimeng    时间: 2010-11-26 12:56
第一个问题,文件很大,用正则可能不现实,即使可以,效率也不见得比遍历高;

第二个问题,应该可以用seek函数定位,不过我没这样做过。

等高手出现。
作者: li_000828    时间: 2010-11-26 13:30
本帖最后由 li_000828 于 2010-11-26 14:41 编辑

第一个用这个试试,不知效率如何:
  1. #!/usr/bin/perl
  2. open LOG,'log.txt';
  3. undef $/;
  4. $str=<LOG>;
  5. $str =~ /\$\w+\s+\w+\n([\w\s]+)\n\$$/s;
  6. print "$1\n";close(LOG);
复制代码
第二个用这个试试:
  1. #!/usr/bin/perl
  2. open LOG,'log.txt';
  3. undef $/;
  4. $str=<LOG>;
  5. $str =~ /\n(.*)$/;
  6. print "$1\n";
  7. close(LOG);
复制代码

作者: x9x9    时间: 2010-11-26 13:56
第一个用这个试试,不知效率如何:第二个用这个试试:
li_000828 发表于 2010-11-26 13:30



    第一个:文件大,不让用遍历,就只能读到一个变量里。应该是文件越大,用遍历越快吧?
   第二个:也不让用遍历,还得一样找 "\n"。
作者: li_000828    时间: 2010-11-26 13:59
回复 5# x9x9


    用全文本模式,对读取文本的效率也影响大吗?
作者: wfnh    时间: 2010-11-26 14:03
第一个问题,文件很大,用正则可能不现实,即使可以,效率也不见得比遍历高;

第二个问题,应该可以用se ...
iamlimeng 发表于 2010-11-26 12:56


可能遍历的效率稍微高一点吧···没试过····
问题二···用Tail之类的模块··但不知效率如何···




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2