在为多行匹配设置正则表达式时遇到问题
我试图抓住所有失败的查询(接收状态为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
答案 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
随着日志变大,将整个日志存储在内存中变得不太理想。而且日志有一种变得相当大的方式。