找到匹配后读取下一行

时间:2014-04-02 19:07:20

标签: perl input pattern-matching match

我有以下信息:

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";
}

谢谢

3 个答案:

答案 0 :(得分:3)

请勿更改输入记录分隔符$/ = "\]";,然后您可以依赖第一组是该行中的第一个组的事实。

此外,如果您的第一个小组始终包含在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

答案 1 :(得分:0)

我发现更容易进入两个可理解的步骤!

#!/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

答案 2 :(得分:0)

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

  • 任何
  • 后跟一个开放式括号
  • 后跟一个数字,一次或多次
  • 后跟一个小括号
  • 后跟任何内容

捕获数字。

这是一个示例,请注意下面的正则表达式...我总是使用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";
        }
    }

大卫