我想解析一个linux应用程序日志文件并仅在该字段值大于特定日期(20140612)时提取与字段匹配的行(EXPIRYTIME:20140612230000)。 这是下面的示例条目;
[DATE: Fri Jun 06 00:00:05 UTC 2014] [MSISDN: 000000000000] [SPID: 0000000000000] [SERVICEID: 00000000000] [PRODUCTID:0000000000000] [UPDATETYPE: 3] [UPDATETIME: 0000000000000] [EXPIRYTIME: 20140612230000] [serviceAvailability:0] [durationOfSuspendPeriod:10] [channelID:2] [microbillingFlag:0] [packagePriceType:2] [status:0] [transactionID:000000000000]
任何建议将不胜感激。感谢。
答案 0 :(得分:2)
awk -F'EXPIRYTIME:\\s*' -v d="20140612" '{s=$2;sub(/\].*/,"",s)}1*s>d*10^6' log
你可以将shell变量传递给d
,但它应该是yyyyMMdd
格式,因为它将在以后乘以1000000。
答案 1 :(得分:1)
在一个理想的世界......
awk '$20 > 20140612000000' logfile | grep 'EXPIRYTIME: 20140612230000'
答案 2 :(得分:1)
这是一个更简单的解决方案,甚至比@Kent's solution快一点,大概是因为涉及的正则表达式更少:
awk -v d='20140612' '$20"" > d' logfile
d='20140612'
在截止日期传递(之后应匹配日志条目)$20
使用awk
的标准字段分隔符,是EXPIRYTIME
字段的值,包括终止]
,例如20140612230000]
$20"" > d
对传入的日期进行词汇比较;请注意,""
- 强制 lexical 比较的连接在这里并不是绝对必要的($20 > d
会这样做),因为awk
解释了字段$20
无论如何,由于字段以]
结尾,因此作为字符串。如果至少一个操作数被视为字符串,则执行 lexical 比较。由于日志条目中的所有日期似乎都具有固定宽度,并且格式导致数字和词汇排序的相同排序,因此无需进行数字转换。
但请注意,将20140612
视为字符串并使用词法比较意味着值20140612000000
也将匹配 - 即截止日期的午夜将包含 。但是,这很容易解决。