作者jkchang (JK)
看板Perl
标题Re: [请益] 新手提问,撷取多行的问题
时间Wed Apr 19 18:04:27 2017
这样有符合需求吗?
#!/usr/bin/perl
while (<DATA>) {
next if (/^\n/);
if (/START/ ... /STOP/) {
if (/^(\d\d):(\d\d):(\d\d)\.(\d{3}).*(<--START|<--STOP|CONTACT)/) {
print "$1:$2:$3.$4 $5\n";
}
}
}
__DATA__
11:13:33.460 INFO <-- REGISTER <ID:12344>
11:13:33.460 INFO CONTACT: <ID:456788>
12:20:21.350 INFO <--START <ID:12344>
12:20:21.350 INFO CONTACT <ID:456788>
12:23:22.420 INFO <--STOP <ID:12344>
12:23:22.420 INFO CONTACT <ID:456788>
12:30:55.300 INFO <--ACK <ID:12344>
12:30:55.300 INFO CONTACT <ID:456788>
输出:
12:20:21.350 <--START
12:20:21.350 CONTACT
12:23:22.420 <--STOP
※ 引述《sostmr (Nikki)》之铭言:
: 大家好,我最近刚接触Perl不到一个月,有个问题一直困扰着我,请各位前辈不吝指教
: 我们最近在分析log,log大致的格式如下
: 11:13:33.460 INFO <-- REGISTER <ID:12344>
: 11:13:33.460 INFO CONTACT: <ID:456788>
: 12:20:21.350 INFO <--START <ID:12344>
: 12:20:21.350 INFO CONTACT <ID:456788>
: 12:23:22.420 INFO <--STOP <ID:12344>
: 12:23:22.420 INFO CONTACT <ID:456788>
: 12:30:55.300 INFO <--ACK <ID:12344>
: 12:30:55.300 INFO CONTACT <ID:456788>
: 我目前程式能分析出来Start ID&Time 和 Stop ID&Time,
: 但是最近被要求要多抓出START&STOP下面的CONTACT ID
: 以我目前的功力都只能撷取出单行单行,请问各位前辈有没有什麽建议可以让我抓<--STA
: RT时,也把下面几行的CONTACT资料一起带出来吗?
: 因为单纯抓CONTACT的话,可能会抓到REGISTER货ACK的多余资料,我只想要START&STOP的
: ...
: 我的程式目前设计如下:
: Open(File,"< $file");
: While ($line = <FILE>)
: {
: $line =~ s/\n/\r\n/g;
: $line =~ s/^\s+//g;
: @data = split(/\s+/,$line);
: If($line =~ /<-- START <ID:/)
: { $line=substr($data[7], 4, 9)
: Print "line\n";
: }
: 希望各位前辈提点一下,谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 203.67.167.3
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Perl/M.1492596269.A.03F.html
1F:推 cutekid: 推喔!好强大的 three dots range operator(常常会忘记) 04/19 23:03
2F:→ sostmr: 哇,结果是我要的!谢谢大大 04/21 15:06
3F:→ sostmr: 但是我有个问题想请教一下,我有办法带出後面id:123444 04/21 15:07
4F:→ sostmr: 吗,我在後面加$6$7都没有办法带出来 04/21 15:07
5F:→ jkchang: 加在CONTACT)後面 .*(ID:\d{1,})>$/ 04/21 16:16
6F:→ jkchang: print $6 ; 04/21 16:18