【问题标题】:perl script to parse file help neededperl 脚本来解析所需的文件帮助
【发布时间】:2013-05-29 05:47:41
【问题描述】:

我是 perl 新手。 我有一个需要使用 perl 脚本解析的文件。

文件格式如下:

05\/26\/2013 06:09:47 \-0700 - AUTHN_SUCCESS - GET - ddsbcggio_ac  - 200.12.33.44 - abcweb.eegeserv.com\/abcweb\/abcwebInitialize.do?PORT=SPQ  - uid=radash@abc.com\,ou=People\,o=zeb.com - 06:09:47 - http - uizweb_zam -  - 2uid=bolched@abc.com
05\/26\/2013 06:09:48 \-0700 - AUTHN_SUCCESS - GET - ddsbcggio_ac  - 200.12.33.44 - abcweb.eegeserv.com\/abcweb\/abcwebInitialize.do?PORT=SPQ  - uid=radash2s@abc.com\,ou=People\,o=zeb.com - 06:09:48 - http - uizweb_zam -  - 2uid=bolchedssd@abc.com
05\/26\/2013 06:09:49 \-0700 - AUTHN_SUCCESS - GET - ddsbcggio_ac  - 200.12.33.43 - abcweb.eegeserv.com\/abcweb\/abcwebInitialize.do?PORT=SPQ  - uid=sjhsjdh@abc.com\,ou=People\,o=zeb.com - 06:09:49 - http - uizweb_zam -  - 2uid=kjsdsdjhjsh@abc.com

从文件中我想得到类似的东西:

05/26/2013 06:09:49  and uid=radash@abc.com,ou=People,o=zeb.com

从每一行开始。

我尝试过 split(),但我无法正确获取它。

请帮忙

【问题讨论】:

  • 为什么拆分不起作用?
  • 如果拆分不起作用,请尝试unpack 玩。

标签: perl


【解决方案1】:

带有拆分的简单脚本

my $IP_FILE=$ARGV[0];
open(IP_FILE,$IP_FILE) || die "Unable to open file...";
while(<IP_FILE>)
{
    chomp;
    my @vals = split("-");
    $vals[0] =~ s/\\//g;
    $vals[7] =~ s/\\//g;
    printf("%s %s\n",$vals[0],$vals[7]);
}
close(IP_FILE);

【讨论】:

  • 顺便说一句,你能推荐任何书籍或链接来快速学习 perl 吗?我也想学习使用 ldap 和 perl
  • @david Perl 网站有优秀的文档和简短的介绍性教程。
  • @Raghuram 我现在有一个问题。有一些行如: 5\/26\/2013 06:09:47 \-0700 - AUTHN_SUCCESS - GET - ddsbcggio_ac - 200.12.33.44 - abcweb.eegeserv.com\/abcweb\/abcwebInitialize.do?PORT=SPQ - uid=rada-sh@abc.com\,ou=People\,o=zeb.com - 06:09:47 - http - uizweb_zam - - 2uid=bolched@abc.com 由于这个: uid=rada-sh ,拆分无法正常工作,您能否提出解决方案?
  • 请编辑您的问题以在文件中添加新模式......因为我无法弄清楚新旧模式之间的区别
【解决方案2】:
perl -ape '$_ = "$F[0] $F[1]  and $F[14]\n"; s|\\||g;' file

【讨论】:

    【解决方案3】:
     #open file 
     open(FILE, "FILENAME.txt")  || die "Can't open file";
    
     # read file into an array 
     @data = <FILE>;
     close(FILE);
     foreach $line(@data) {
    
     @output = split / /, $line;
     $output[0] =~ s/\\//g;
     print "$output[0] $output[1] and $output[16]\n";
     }
    

    或者你可以推送它以供以后使用。

     #open file 
     open(FILE, "FILENAME.txt")  || die "Can't open file";
    
     # read file into an array 
     @data = <FILE>;
     close(FILE);
     foreach $line(@data) {
    
     @output = split / /, $line;
     $output[0] =~ s/\\//g;
     push @result, "$output[0] $output[1] and $output[16]\n";
     }
     print @result;
    

    不是很干净的代码,因为如果文件的数据曾经移动到文件中的其他位置,它会给出不正确的结果,但这是可行的,您将了解拆分的工作原理。

    关于链接的问题。这是一本很好的初学者电子书。

      http://bookboon.com/en/perl-for-beginners-ebook
    

    【讨论】:

    【解决方案4】:
    perl -lane '$a="@F[0,1]";$a=~s/[\\\/]//g;$F[14]=~s/\\//g;print "$a and $F[14]"' your_file
    

    【讨论】:

      【解决方案5】:

      如果你知道分隔符,- 你可以使用Text::ParseWords 来解析它。它是 Perl 5 中的核心模块。我提供了正则表达式 \s*-\s* 来去除破折号周围的空白。

      use strict;
      use warnings;
      use Text::ParseWords;
      use feature 'say';
      
      while (<DATA>) {
          chomp;
          my @data = quotewords('\s*-\s*', 0, $_);
          say join " ", @data[0, 6];
      }
      
      
      __DATA__
      05\/26\/2013 06:09:47 \-0700 - AUTHN_SUCCESS - GET - ddsbcggio_ac  - 200.12.33.44 - abcweb.eegeserv.com\/abcweb\/abcwebInitialize.do?PORT=SPQ  - uid=radash@abc.com\,ou=People\,o=zeb.com - 06:09:47 - http - uizweb_zam -  - 2uid=bolched@abc.com
      05\/26\/2013 06:09:48 \-0700 - AUTHN_SUCCESS - GET - ddsbcggio_ac  - 200.12.33.44 - abcweb.eegeserv.com\/abcweb\/abcwebInitialize.do?PORT=SPQ  - uid=radash2s@abc.com\,ou=People\,o=zeb.com - 06:09:48 - http - uizweb_zam -  - 2uid=bolchedssd@abc.com
      05\/26\/2013 06:09:49 \-0700 - AUTHN_SUCCESS - GET - ddsbcggio_ac  - 200.12.33.43 - abcweb.eegeserv.com\/abcweb\/abcwebInitialize.do?PORT=SPQ  - uid=sjhsjdh@abc.com\,ou=People\,o=zeb.com - 06:09:49 - http - uizweb_zam -  - 2uid=kjsdsdjhjsh@abc.com
      

      输出:

      05/26/2013 06:09:47 -0700 uid=radash@abc.com,ou=People,o=zeb.com
      05/26/2013 06:09:48 -0700 uid=radash2s@abc.com,ou=People,o=zeb.com
      05/26/2013 06:09:49 -0700 uid=sjhsjdh@abc.com,ou=People,o=zeb.com
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多