我需要减去 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]}'