首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当中间有空格或回车符时,匹配IP地址

当中间有空格或回车符时,匹配IP地址
EN

Stack Overflow用户
提问于 2014-03-15 22:16:27
回答 5查看 687关注 0票数 0

我正在编写一个Perl脚本,其中用户从命令行运行tracert并从cli复制该脚本,然后在perl CGI脚本中提交tracert &我的脚本将tracert保存为一个文件。

然后,我一次打开一行文件,并通过Perl Regex为ip地址打开grep。

问题是:有时用户跟踪某些跃点的结果变得太大,下面是一个示例,IP地址被分成两部分(使用CR和LF ),因此我的正则表达式匹配失败。

4 2 ms 1 ms 1 ms routers.static-ABC.XYZ.net.in [165

.112.109.61]

我正在寻找一些解决方案,或者我可以删除文件的所有空白和其他空格,或者获得一个正则表达式,通过它我可以匹配两行中间的IP地址(使用CR & LF )。

如果我能以某种方式让我的程序在文件中搜索"]“,如果我没有找到它,并且在行尾有一个空格(CR & LF),那么删除空格并加入该行。这会解决我的问题。

以下是脚本的一部分:

代码语言:javascript
运行
复制
my @array;
open(my $fh, "<", "trace.txt")
or die "Failed to open file: $!\n";


while(<$fh>) { 

    &match_ip($_);  ##match_ip(@array);

} 
close $fh;

sub match_ip()
{       

    if($_ =~ m/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/g)
    {
        $ip = "$1\.$2\.$3\.$4";
        print "$ip\n";
    }
}
EN

回答 5

Stack Overflow用户

发布于 2014-03-15 22:31:19

它只发生在点上吗?在这种情况下,您可以这样做:

代码语言:javascript
运行
复制
if($_ =~ m/([0-9]{1,3})\s*\.\s*([0-9]{1,3})\s*\.\s*([0-9]{1,3})\s*\.\s*([0-9]{1,3})/g)
{
    $ip = "$1\.$2\.$3\.$4";
    print "$ip\n";
}

或者,您也可以利用IP出现在方括号之间的事实(如果是这样的情况,如您所示的示例;如果不是这样,您仍然可以这样做,但在最后过滤掉非IP):

代码语言:javascript
运行
复制
$_ =~ /\[(.*?\s*?.*?)\]/;  # extract everything between square brackets
my $ip = $1;     # take that IP
$ip =~ s/\s//g; # remove possible white spaces from the IP
票数 1
EN

Stack Overflow用户

发布于 2014-03-15 22:55:44

如果您逐行遍历文件,并且IP被分成两行,那么所提出的正则表达式解决方案都不会起作用。您可以以段落模式读取数据,在这种情况下,所有跃点都将位于单个字符串中。

就我个人而言,我可能会考虑以不同的方式来做这件事。我将这一行拆分为一个数组。Windows tracert命令对每一跳使用8到9个字段。如果数组的字段少于8个,则行被“换行”,并且应该在解析出IP之前添加到前一行。这种方法要求您一次处理2行,以便确定行的换行并将行重新连接在一起。

票数 0
EN

Stack Overflow用户

发布于 2014-03-15 23:00:56

逐行解决方案:

代码语言:javascript
运行
复制
#!/usr/bin/perl

use strict;
use warnings;

while(<DATA>) {
    if (/(\d+(?:\.\d+){3})]$/) { 
        print $1 . "\n";
    } else {
        my $tmp;
        if (/\[([\d.]+)$/) {
            $tmp = $1;
        } else { next; }
        while(<DATA>) {
            if (/([\d.]+)]$/) {
                $tmp .= $1;
                print $tmp . "\n";
                last;
            } elsif (/([\d.]+)$/) {
                $tmp .= $1;
            }
        }
    }
}


__DATA__
 1    24 ms    22 ms    22 ms  1.32.202.62.cust.bluewin.ch [62.202.32.1]
 2    22 ms    24 ms    22 ms  1.32.202.62.cust.bluewin.ch [62.202.32.1]
 3    24 ms    23 ms    22 ms  net481.bwrt2zhb.bluewin.ch [195.186

 .121.1]
 4   314 ms   162 ms    22 ms  net125.bwrt1inb.bluewin.ch [195.186.125.71]
 5    34 ms    23 ms    24 ms  if114.ip-plus.bluewin.ch [195.186.0.114]
 6    27 ms    29 ms    29 ms  i68geb-005-gig4-2.bb.ip-plus.net [138.1

 87.1

 30.158]
 7    39 ms    39 ms    38 ms  i00par-005-pos4-0.bb.ip-plus.net [138.187.129.34]
 8    38 ms   320 ms    39 ms  feth2-kara-ielo.freeix.net [213.228.3.203]
 9   284 ms    39 ms    39 ms  feth0-bestelle.tlcy.fr.core.ielo.net [212.85.144.6]
10    90 ms   158 ms    83 ms  chloe.wikimedia.org [212.85.150.132] 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22424933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档