【发布时间】:2022-11-17 04:37:57
【问题描述】:
我想在不更改 Windows 格式的大型日志文件的情况下执行以下操作
- 删除所有 CRLF 字符
- 在日志文件最后一行的“CLG...”“TRC...”之间插入一个空行
- 以段落模式读取结果后,如果存在特定字符串则打印段落
下面的代码不起作用。
use strict; use warnings; my $ID = "D5CCA1AE-686D11E2-A881ED01-8DFA6D70@10.218.16.2"; my $SDP; open (LOG, "file.log") || die $!; my $line; while(<LOG>) { $line .= $_; $line =~s/\r//g; } local $/ = ''; while (<>) { if ( /Call-ID:\s+(.+)/ and $ID ) { $SDP = 1; print; next; } print if $SDP && /\brtpmap\b/; $SDP = 0; } close(LOG);
Jan 28 11:39:37.525 CET: //1393628/D5CC0586A87B/SIP/Msg/ccsipDisplayMsg:^M Received:^M SIP/2.0 200 OK^M Via: SIP/2.0/UDP 10.218.16.2:5060;branch=z9hG4bKB22001ED5^M From: "Frankeerapparaat Secretariaat" <sip:089653717@10.210.2.49>;tag=E7E0EF64-192F^M To: <sip:022046187@10.210.2.49>;tag=25079324~19cc0abf-61d9-407f-a138-96eaffee1467-27521338^M Date: Mon, 28 Jan 2013 10:39:32 GMT^M Call-ID: D5CCA1AE-686D11E2-A881ED01-8DFA6D70@10.218.16.2^M CSeq: 102 INVITE^M Allow: INVITE, OPTIONS, INFO, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY^M Allow-Events: presence^M Supported: replaces^M Supported: X-cisco-srtp-fallback^M Supported: Geolocation^M Session-Expires: 1800;refresher=uas^M Require: timer^M P-Preferred-Identity: <sip:022046187@10.210.2.49>^M Remote-Party-ID: <sip:022046187@10.210.2.49>;party=called;screen=no;privacy=off^M Contact: <sip:022046187@10.210.2.49:5060>^M Content-Type: application/sdp^M Content-Length: 209^M ^M v=0^M o=CiscoSystemsCCM-SIP 2000 1 IN IP4 10.210.2.49^M s=SIP Call^M c=IN IP4 10.210.2.1^M t=0 0^M m=audio 16844 RTP/AVP 8 101^M a=rtpmap:8 PCMA/8000^M a=ptime:20^M a=rtpmap:101 telephone-event/8000^M a=fmtp:101 0-15^M ^M Jan 28 11:39:37.529 CET: //1393628/D5CC0586A87B/SIP/Msg/ccsipDisplayMsg:^M Sent:^M ACK sip:022046187@10.210.2.49:5060 SIP/2.0^M Via: SIP/2.0/UDP 10.218.16.2:5060;branch=z9hG4bKB2247150A^M From: "Frankeerapparaat Secretariaat" <sip:089653717@10.210.2.49>;tag=E7E0EF64-192F^M To: <sip:022046187@10.210.2.49>;tag=25079324~19cc0abf-61d9-407f-a138-96eaffee1467-27521338^M Date: Mon, 28 Jan 2013 10:39:36 GMT^M Call-ID: D5CCA1AE-686D11E2-A881ED01-8DFA6D70@10.218.16.2^M Max-Forwards: 70^M CSeq: 102 ACK^M Authorization: Digest username="Genk_AC_1",realm="infraxnet.be",uri="sip:022046187@10.210.2.49:5060",response="9546733290a96d1470cfe29a7500c488",nonce="5V/Jt8FHd5I8uaoahshiaUud8O6UujJJ",algorithm=MD5^M Allow-Events: telephone-event^M Content-Length: 0^M ^M ^M Jan 28 11:39:37.529 CET: //1393627/D5CC0586A87B/SIP/Msg/ccsipDisplayMsg:^M Sent:^M SIP/2.0 200 OK^M Via: SIP/2.0/UDP 192.168.8.11:5060;branch=z9hG4bK24ecaaaa6dbd3^M From: "Frankeerapparaat Secretariaat" <sip:3717@192.168.8.11>;tag=e206cc93-1791-457a-aaac-1541296cf17c-29093746^M To: <sip:022046187@192.168.8.28>;tag=E7E0F8A4-EA3^M Date: Mon, 28 Jan 2013 10:39:32 GMT^M Call-ID: fedc8f80-10615564-45df0-b08a8c0@192.168.8.11^M CSeq: 101 INVITE^M Allow: INVITE, OPTIONS, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY, INFO, REGISTER^M Allow-Events: telephone-event^M Remote-Party-ID: <sip:022046187@192.168.8.28>;party=called;screen=no;privacy=off^M Contact: <sip:022046187@192.168.8.28:5060>^M Supported: replaces^M Supported: sdp-anat^M Server: Cisco-SIPGateway/IOS-15.3.1.T^M Session-Expires: 1800;refresher=uas^M Require: timer^M Supported: timer^M Content-Type: application/sdp^M Content-Disposition: session;handling=required^M Content-Length: 247^M ^M v=0^M o=CiscoSystemsSIP-GW-UserAgent 7276 9141 IN IP4 192.168.8.28^M s=SIP Call^M c=IN IP4 192.168.8.28^M t=0 0^M m=audio 30134 RTP/AVP 8 101^M c=IN IP4 192.168.8.28^M a=rtpmap:8 PCMA/8000^M a=rtpmap:101 telephone-event/8000^M a=fmtp:101 0-15^M a=ptime:20^M ^M CLG(2022-11-07 00:09:06.444)| Call(Terminate) | 302A330B040C73070A021806021C0200 | ^M TRC(2022-11-15 00:00:38.012)| SIP( OUT : Response ) Trying( 100 INVITE ) | 2 | | 0 | 332C30050A0F750A00011A06021C0200 | SIP/2.0 100 Trying^M
【问题讨论】:
-
1. 显示的代码仅删除回车符(而不是换行符)。无论如何,更改为 UNIX 换行符有什么意义? 2.“CLG...”“TRC...”是不是在最后一行,正如文本所暗示的那样;它们在不同的最后两行。您还想在它们之间添加额外的空白行吗?那会很容易,但是为什么您发现它比更改换行符慢,需要在每一个线?恐怕我不确定我是否了解需要做什么。
-
最后,我根本没有得到代码和那两个
while循环——首先遍历该文件,第二个读取命令行中给出的名称的文件。为什么?我以为这都是一个日志文件? -
1.只需要去掉回车符即可。只有这样你才能以段落模式阅读。 2. 以“CLG...”“TRC...”开头的行也应被识别为一个段落。日志很大而且被截断了,但是“TRC”行之后有很多日志。
-
打印日志文件中包含特定字符串的所有段落。例如,您应该查找并打印包含字符串“D5CCA1AE-686D11E2-A881ED01-8DFA6D70@10.218.16.2”的段落。但是,每一行都包含一个回车符,它将一个日志文件识别为一个段落。一个日志文件是正确的。我不知道如何在一个while循环中解决它,所以我强迫自己去做。
标签: perl