在awk中找到时间戳子字符串的差异

时间:2019-01-23 20:13:19

标签: awk

每当两个连续日志之间的时间戳不同时,我试图在/ var / log / messages输出中附加一些文本,例如:

上一个日志: 00:01:5 9和当前日志 00:02:0 0

上一个日志: 00:01:4 9和当前日志 00:01:5 0

如果时间戳记的子字符串在连续日志中不同,请在$0后面附加一些消息。

您可以按照以下命令运行,该命令工作1分钟,需要10秒钟。

tail -f /var/log/messages |awk '{split($3,a,":");split($3,b,"");new_time=a[1]":"a[2]":"b[1]; if(prev_time==new_time) print $0; else print "10 Second group is over, starting new: "$0" "prev_time " "new_time }   {split($3,a,":");split($3,b,"");prev_time=a[1]":"a[2]":"b[1]}'

所需结果是对上述命令的修改,以在10秒钟的日志间隔中打印相同的消息,当前执行1分钟。我已经使用split()捕获了'HH:MM:S“而不是” HH:MM:SS“,因此每当私有的'HH:MM:S”和当前的'HH:MM:S“ differ时,打印消息” { {1}}”。不确定此处的错误是什么。 简而言之,目前它的工作方式是每分钟更改一次,而当第二秒从39秒更改为40秒或从09秒更改为10秒时,我需要它。不是11秒到12秒。 HH:MM: S S,需要更改为粗体的S。

示例行:

10 Second group is over, starting new: $0

1 个答案:

答案 0 :(得分:1)

这是一般想法:

$ for((i=35;i<45;i++)); do echo Jan 23 00:01:$i; done |  
  awk '{split($3,a,":"); print $0, (p!=(c=int(a[3]/10))?"<<<":""); p=c}'

Jan 23 00:01:35 <<<
Jan 23 00:01:36 
Jan 23 00:01:37 
Jan 23 00:01:38 
Jan 23 00:01:39 
Jan 23 00:01:40 <<<
Jan 23 00:01:41 
Jan 23 00:01:42 
Jan 23 00:01:43 
Jan 23 00:01:44 

第一部分是为脚本生成的测试数据,因为您没有提供足够的数据。第一行存在虚假匹配,可以通过NR>1条件消除,但我认为这不是关键。