1

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

我试图抓取所有失败的查询(接收状态为 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>

查看所有失败的 URL,如 URL1、URL3

4

2 回答 2

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
于 2013-06-25T10:40:07.020 回答
0

这也很简单,有一点状态:

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

随着日志变得越来越大,将整个日志存储在内存中变得不太理想。并且日志有办法变得相当大。

于 2013-06-25T10:49:50.047 回答