shell中如何进行两次减法

shell中如何进行两次减法

我需要减去 shell 中时间格式的两行。时间格式为 hh:mm:ss 我使用下面的代码来获取时间。

cat /var/log/kern.log |grep usb |tail -2| awk '{print $3}'

上述代码的输出是

18:23:24
18:20:20

我怎样才能找到秒级的差异?

答案1

我会更进一步(受到启发这个帖子):

# => 18:23:24 --> 66204
grep usb /var/log/kern.log|tail -2|awk '{print $3}'|awk -F: '{print ($1 * 3600) + ($2 * 60) + $3 }'

所以,在我之后:

66204
66020

然后你可以这样做:

echo $((66204-66020)) # => 184

答案2

一个更通用的解决方案,因为它也适用于不同日期的时间:

echo "18:23:24
18:20:20" | 
  (read later_time; read former_time;
    former_seconds=$(date --date="$former_time" +%s);
    later_seconds=$(date --date="$later_time" +%s);
    echo $((later_seconds-former_seconds)) )
184

答案3

如果您使用,awk则可以在一次调用中完成

awk '
/usb/{
("date +%s -d "$3)|getline t[++i];
}
END{
print t[i-1]-t[i];
}' /var/log/kern.log

答案4

awk 中的整个管道没有大量不必要的管道。
与 costas 类似,但不使用任何外部命令。

awk '/usb/{split($3,a,":");b[++x]=(a[1]*3600)+(a[2]*60)+a[3]}END{print b[x-1]-b[x]}' /var/log/kern.log

如果您决定保留管道,这只是确定日期的最后一点

 awk '{split($1,a,":");b[x++]=(a[1]*3600)+(a[2]*60)+a[3]}END{print b[0]-b[1]}'

相关内容