我写了一个脚本,总结了很长的日志文件。我的一个小问题是日志很容易出现损坏的条目,因此我的摘要有时包含其中的一些错误行。我的脚本生成了一个中间临时文件,我只需要从中挑选出有效的行即可。
以下几行有效,我需要匹配以下几行:
21/05/14 09:17 134U 0993 EUser_Message 01 21/05/14 11:07 134UD 0994 User_Message B02 21/05/14 11:47 134P 0995 User_Message UOD1 21/05/14 12:41 134B18 0996 User_Message UOD2 21 / 05/14 14:00 134B 0997 User_Message T02 21/05/14 14:22 134NV 0998 User_Message D02 21/05/14 15:25 121U 0999 EUser_Message 03 21/05/14 16:38 121UD 1000 EUser_Message 04 22/05 / 14 07:39 134TP 1001 EUser_Message 08 22/05/14 09:55 134P 1002 EUser_Message 13 22/05/14 10:46 134B 1003 EUser_Message 14 22/05/14 12:00 134NonVac 1004 User_Message UOD3
这些是有效的,因为它们包含字符串“ User_Message”,并且它们以特定的方式非常明确地形成:
(2位数字)(正斜杠)(2位数字)(正斜杠)(2位数字)(3个空格)(2位数字)(冒号)(2位数字)(3个空格)(4至9个字母或数字)(1至6个空格)(4位数字)(4个空格)(“ User_Message字符串”)(0或1个空格)(换行)
需要忽略的条目示例如下:
User_Message UOD1 19/08/14 11:46 1388 EUser_Message 01 03/07/13 0645 03/07/13 0646 03/07/13 0647 03/07/13 15:36 134U 0648 0862 17/04/14 0866 17 / 04/14 0867 17/04/14 0868 17/04/14 17/04/14 10:04 134TP 0869 EUser_Message 01 21/05/14 14:02 134B 0982 0983 22/05/14 22/05/14 12: 48 134U 0984 User_Message UOD1 1015 03/06/14 11/07/13 08:12 134B 0011 11/07/13 12:39 134B 0012 11/07/13 13:53 134B 0013 12/07/13 08:01 134P 0014 12/07/13 08:29 134B 0015
我试图匹配有效行的代码部分是:
if ($line =~ /\d{2}\/\d{2}\/\d{2}\s{3}\d{2}:d{2}\s{3}\d{4}\s{4}.*\n/) {
如果有人可以向我展示如何正确构建仅与上面显示的有效文本行匹配的正则表达式,我将不胜感激。
我不会对此进行单正则表达式-正则表达式功能强大,但它们...很好,很容易变得难以理解且容易受到极端情况的攻击。
首先,split
将您的代码行放入字段中,然后对每个字段进行验证。一个特别有用的技巧是,您可以非常有效地使用eval
和Time::Piece->strptime
验证日期。
#!/usr/bin/perl
use strict;
use warnings;
use Time::Piece;
while ( <DATA> ) {
my ( $date, $time, $somecode, $othercode, $msgtype, $msgcode ) = split;
if ( $date =~ m,^\d+/\d+/\d+$,
and $time =~ m,^\d+:\d+$,
and eval { Time::Piece->strptime("$date $time", "%d/%m/%y %H:%M") } ) {
print "Date is ok\n";
}
else { print "$date $time is invalid\n"; next; }
if ( $somecode =~ m/^\w+\d+$/ ) {
print "somecode is ok\n";
}
else {
print "Error with somecode $somecode\n";
}
if ( $othercode =~ m,^\d{4}$, ) {
print "othercode is ok\n";
}
else {
print "Error with $othercode \n";
next;
}
if ( $msgtype =~ m/User_Message/
and $msgcode =~ m/\w+/ ) {
print "$msgtype $msgcode ok\n";
}
else {
print "Error with $msgtype $msgcode\n";
next;
}
print "Line: $. is ok\n$_";
}
__DATA__
21/05/14 09:17 134U 0993 EUser_Message 01
21/05/14 11:07 134UD 0994 User_Message B02
21/05/14 11:47 134P 0995 User_Message UOD1
21/05/14 12:41 134B18 0996 User_Message UOD2
21/05/14 14:00 134B 0997 User_Message T02
21/05/14 14:22 134NV 0998 User_Message D02
21/05/14 15:25 121U 0999 EUser_Message 03
21/05/14 16:38 121UD 1000 EUser_Message 04
22/05/14 07:39 134TP 1001 EUser_Message 08
22/05/14 09:55 134P 1002 EUser_Message 13
22/05/14 10:46 134B 1003 EUser_Message 14
22/05/14 12:00 134NonVac 1004 User_Message UOD3
User_Message UOD1
19/08/14 11:46 1388 EUser_Message 01
03/07/13 0645 03/07/13 0646 03/07/13 0647 03/07/13 15:36 134U 0648
0862 17/04/14 0866 17/04/14 0867 17/04/14 0868 17/04/14
17/04/14 10:04 134TP 0869 EUser_Message 01
21/05/14 14:02 134B 0982
0983 22/05/14 22/05/14 12:48 134U 0984 User_Message UOD1
1015 03/06/14
11/07/13 08:12 134B 0011
11/07/13 12:39 134B 0012
11/07/13 13:53 134B 0013
12/07/13 08:01 134P 0014
12/07/13 08:29 134B 0015
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句