当前位置: 首页 > 知识库问答 >
问题:

Perl正则表达式错误

匡祖鹤
2023-03-14

我目前正在尝试创建一个日志解析器,它从一个输入文件(a.log)中获取以下格式的一系列ping报告:(194.12.224.34中的64字节:icmp_seq=1 ttl=47 time=66.7 ms)并构建一个输出文件(a.csv)。

经过多次尝试,我发现了下面的错误。我的同事给了我他的代码(如下),虽然写得不同,但本质上是一样的。他的代码给出了同样的错误,尽管他的代码在同一个任务中正常工作。任何帮助都将不胜感激!

我现在相信我的前两个正则表达式的工作还行,第三个是问题。下面是我试图解析的内容:

发送120个数据包,接收120个数据包,0%数据包丢失,时间119247ms rtt min/avg/max/mdev=65.944/67.381/72.714/1.728 ms

我在这里的第一篇帖子,如果遗漏了什么,我会道歉。

$INPUT  = "ping.log";
$OUTPUT = "pingParsed.csv";

# > operator puts the write function in overwrite mode rather than append.
open (INPUT, '<', $INPUT);
open (OUTPUT, '>', $OUTPUT);

while (<INPUT>) {

# if (timestamp regex)
if(/(\w{3})\s+(\w{3})\s+(\d+)\s+(\d+):(\d+):(\d+)\s+GMT\s+(\2013)/) {


# print OUTPUT (date regex variables, $1 = Day, $2 = Month, $3 = Day, $4 = hour, $7 = year)
print OUTPUT "$1 , $2 , $3 , $4 , $7";

$headers = "IP, Seq, Time";

print OUTPUT "$headers";

}

# if (ping info regex, $1 = IP address, $2 = Seq, $3 = Time)
if ( m/icmp_seq=
(\S+)
\s+ttl=
(\S+)
\s+time=
(\S+) /x) # x allows use of whitespaces and comments in the regex.
{
    print "$1, $2, $3\n";
}


# if (regex for total ping info - I think this is line 55.) 
if (/\d+\d+\d+\s+\packets\s+\transmitted,\s+\d+\d+\d+\s+\received,\s+(\d+)\s+\packet\s+\loss,\s+time\s+(\d+)\ms\s+\min\avg\max\mdev\s+=\s+(\(S+)\\/\(S+)\\/(S+)\\/\(\S+)\s+\ms/) {
headers: 
print ("$15 = packet loss(%), $22 = time(ms), $28 = rttmin, $33 = arg, $35 = max, $37 = ndev");

print OUTPUT ($15, $22, $28, $33, $35, $37);

 } 


}

close $INPUT;
close $OUTPUT;

错误:

Backslash found where operator expected at ./pingParseScript.pl line 55, near "/\d+\d+\d+\s+\packets\s+\transmitted
    (Missing operator before \?)

在运算符预期的位置找到反斜杠/pingParseScript。pl第55行,靠近“\”(在\?之前缺少操作员)在运算符预期的位置找到反斜杠/pingParseScript。pl第55行,靠近“\”(在\?之前缺少操作员)语法错误在/pingParseScript。pl第55行,靠近“/\d\d\s\packets\s\transmisted,\s\d\d\s\received,\n替换模式未终止于./pingParseScript.pl第55行。

共有2个答案

丁雅惠
2023-03-14

if语句后缺少大括号,应该这样写:

if(/icmp_seq=(\S+)\s+ttl=(\S+)\s+time=(\S+)/)
{

#if(/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+icmp_seq=(\S+)\s+ttl=\d+\s+time=(\S+)/)


print OUTPUT "$8, $10, $16"; 
}

或者这个:

print OUTPUT "$8, $10, $16"
    if(/icmp_seq=(\S+)\s+ttl=(\S+)\s+time=(\S+)/);

而且

while (INPUT)

应该这样写:

while (<INPUT>)

用以下语句替换if语句:

if( /icmp_seq=
(\S+)
\s+ttl=
(\S+)
\s+time=
(\S+)/x ) #x allows use of whitespaces and comments in your regex
{
    print "$1, $2, $3\n"; 
}
葛奇
2023-03-14

我看到两个问题:

1) 通过while更改while(输入)(

2) 最后一个if必须包括{},并且重新启动regexp内存(从$1

if(/icmp_seq=(\S+)\s+ttl=(\S+)\s+time=(\S+)/) {
   print OUTPUT "$1, $2, $3"; 
}

另外,以现代perl方式使用词法文件句柄:

open my $input_fh, '<', $INPUT or die $!;
open my $output_fh, '>', $OUTPUT or die $!;

while( <$input_fh> ) {
   # ...
}


close $input_fh;
close $output_fh;

 类似资料:
  • 主要内容:匹配操作符,实例,正则表达式变量,实例,替换操作符,实例,转化操作符,实例,更多正则表达式规则正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式。 Perl的正则表达式的三种形式,分别是匹配,替换和转化: 匹配:m/ /(还可以简写为/ /,略去

  • 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式。 Perl的正则表达式的三种形式,分别是匹配,替换和转化: 匹配:m//(还可以简写为//,略去m) 替

  • 下面是我正在使用的正则表达式的最新版本,它抛出了错误“Invalid regular expression” XSD:正则表达式在位置4验证失败:当前选项设置不支持此表达式。 我在xsd文件中得到了这个异常,我正在message broker(IIB)中开发这个xsd。有谁能帮我解决这个问题吗?

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?

  • 问题内容: 我必须在Python中基于PCRE解析一些字符串,而且我不知道该怎么做。 我要解析的字符串如下所示: 在此示例中,我必须获得以下不同项: 我发现与Python中的PCRE操作有关的唯一内容是以下模块:http : //pydoc.org/2.2.3/pcre.html(但它被编写为.so文件…) 您知道是否存在一些Python模块可以解析这种字符串吗? 问题答案: Python如何处理

  • 在 OpenResty 中,同时存在两套正则表达式规范:Lua 语言的规范和 ngx.re.* 的规范,即使您对 Lua 语言中的规范非常熟悉,我们仍不建议使用 Lua 中的正则表达式。一是因为 Lua 中正则表达式的性能并不如 ngx.re.* 中的正则表达式优秀;二是 Lua 中的正则表达式并不符合 POSIX 规范,而 ngx.re.* 中实现的是标准的 POSIX 规范,后者明显更具备通用