【问题标题】:Read next line after match is found找到匹配后读取下一行
【发布时间】:2014-04-02 19:07:19
【问题描述】:

我收到以下信息:

Dec  1 23:59:08 ftp1 ftpd[4682]: FTP LOGIN FROM 192.168.0.1 [192.168.0.1], prd
Dec  1 23:59:10 ftp1 ftpd[4690]: FTP LOGIN FROM 192.168.0.2 [192.168.0.2], prod1

我正在尝试获取“[]”之间的数字,但只有第一组,所以在第一行中我想要 4682,然后让它转到下一行以查找下一个。我有以下代码,但目前它每行都匹配两个集合,所以我得到 4682 和 192.168.0.1。在完成第一个匹配后,我将如何进入下一行

$/ = "\]";

while (my $line = <INPUT>) {
    $line =~ /\[(.*)\]/s;
    my $contents = $1;
    print $contents, "\n";
}

谢谢

【问题讨论】:

    标签: perl input pattern-matching match


    【解决方案1】:

    不要更改您的输入记录分隔符$/ = "\]";,那么您可以相信您的第一个组是该行中的第一个。

    此外,如果您的第一个组始终包含在 ftpd[] 中,那么您可以使您的正则表达式更具限制性以防万一:

    use strict;
    use warnings;
    
    while (<DATA>) {
        if (/ftpd\[(.*?)\]/) {
            print "$1\n";
        }
    }
    
    __DATA__
    Dec  1 23:59:08 ftp1 ftpd[4682]: FTP LOGIN FROM 192.168.0.1 [192.168.0.1], prd
    Dec  1 23:59:10 ftp1 ftpd[4690]: FTP LOGIN FROM 192.168.0.2 [192.168.0.2], prod1
    

    输出:

    4682
    4690
    

    【讨论】:

      【解决方案2】:

      我发现分两个容易理解的步骤更容易!

      #!/usr/bin/perl
      use strict;
      use warnings;
      
      while (my $line = <>) {
          $line =~ s/\]:.*//;    # Lose ]: and everything after
          $line =~ s/.*\[//;     # Lose [  and everything before
          print $line;
      }
      4682
      4690
      

      【讨论】:

        【解决方案3】:

        使用正则表达式来查找您想要的内容,即:

        • 任何东西
        • 后跟一个左括号
        • 后跟一个数字,一次或多次
        • 后跟一个右括号
        • 什么都跟着

        捕捉数字。

        这是一个示例,请注意下面的正则表达式...我总是将 m{} 用于带有 xms 修饰符的正则表达式,但这不应该改变任何东西...

            #!/usr/bin/perl -w
            use strict;
        
            while (my $line = <>) {
                chomp $line;
                if ($line =~ m{.+\[(\d+)\].+}xms) {
                    my $process_id = $1;
                    print "Process ID: $process_id\n";
                }
            }
        

        大卫

        【讨论】:

          猜你喜欢
          • 2014-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-30
          • 1970-01-01
          • 2014-11-02
          • 1970-01-01
          • 2022-11-25
          相关资源
          最近更新 更多