perl REGEX匹配多行

时间:2013-06-25 10:09:02

标签: regex perl

在为多行匹配设置正则表达式时遇到问题

我试图抓住所有失败的查询(接收状态为2)但没有成功

Perl一行看起来像

perl -e '$text = `cat errors.log`;while($text =~ m/^request.*?(\/.*?)\n.*?receive status is 2$/sgm ){print $1."\n";}'

样本日志如下

***** test 0: *****
* Request:
request = /Lookup?url=URL1

received in 0.108 milliseconds
receive status is 2
-- STATUS : 1 --
      <RESULT SET 1>


***** test 1: *****
* Request:
request = /Lookup?url=URL2

received in 44.753 milliseconds
receive status is 0
-- STATUS : 0 --
      <RESULT SET 2>


***** test 2: *****
* Request:
request = /Lookup?url=URL3

received in 44.753 milliseconds
receive status is 2
-- STATUS : 3 --
      <RESULT SET 3>

查看抓取所有失败的网址,例如URL1,URL3

2 个答案:

答案 0 :(得分:3)

你永远不应该使用

`cat errors.log` 
Perl中的

在Perl中读取文件是简单而有效的,所以要学习它。

perl -lnwe 'BEGIN { $/= $/x3 } if (/receive status is 2/) 
            { print /request\s*=\s*(.+)/ }'  errors.log

说明:

  • -n会将脚本的参数视为文件名参数,并打开这些文件以供阅读。
  • -l将处理行结尾(此处打印)
  • BEGIN内的代码将输入记录分隔符设置为三个换行符(或操作系统正在使用的任何内容),这样我们就可以读取块中的输入文件,直到读取三个连续的换行符。

剩下的就是两个简单的正则表达式。因为我们花了一些时间确保将块保持分离,所以我们现在可以使用更简单的正则表达式。

<强>输出:

/Lookup?url=URL1
/Lookup?url=URL3

答案 1 :(得分:0)

这有点简单:

perl -lne '$last = $1 if /request = (.+)/; print $last if /^receive status is 2/' errors.log

随着日志变大,将整个日志存储在内存中变得不太理想。而且日志有一种变得相当大的方式。