Bash脚本命令用于提取自定义日志文件中的行

时间:2014-06-06 14:07:04

标签: bash awk sed

我想解析一个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]

任何建议将不胜感激。感谢。

3 个答案:

答案 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也将匹配 - 即截止日期的午夜将包含 。但是,这很容易解决。