我有以下信息:
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";
}
谢谢
答案 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";
}
}
大卫