Linux 在日志文件中计算时间
我以如下形式创建了日志文件: log.txtLinux 在日志文件中计算时间,linux,bash,unix,awk,sed,Linux,Bash,Unix,Awk,Sed,我以如下形式创建了日志文件: log.txt Unavailable 06.08.2014 23:59:36 - 07.08.2014 00:00:36 Unavailable 15.08.2014 04:53:32 - 15.08.2014 04:53:32 Available 15.08.2014 04:54:32 - 15.08.2014 05:17:32 Unavailable 15.08.2014 05:18:32 - 15.08.2014 05:18:32 Unavailable
Unavailable 06.08.2014 23:59:36 - 07.08.2014 00:00:36
Unavailable 15.08.2014 04:53:32 - 15.08.2014 04:53:32
Available 15.08.2014 04:54:32 - 15.08.2014 05:17:32
Unavailable 15.08.2014 05:18:32 - 15.08.2014 05:18:32
Unavailable 15.08.2014 08:22:00 - 15.08.2014 08:22:00
Available 15.08.2014 08:23:00 - 17.08.2014 01:44:27
Unavailable 17.08.2014 01:45:27 - 17.08.2014 01:52:33
Available 17.08.2014 01:53:33 - 02.09.2014 11:07:21
我需要以秒为单位计算不可用时间。我不是任何sed/awk大师,因此我对这个问题的看法非常简单:
cat log.txt | grep "Unav" | sed -r 's/\<Unavailable\>//g;s/:/ /g;s/\./ /g' |
awk -F- '{d2=mktime($2);d1=mktime($1);print d2-d1;}' | awk '{s+=$1} END {print s}'
cat log.txt | grep“unv”| sed-r的//\//g;s/://g;s/\.//g'|
awk-F-'{d2=mktime($2);d1=mktime($1);打印d2-d1;}'|awk'{s+=$1}结束{print s}'
我惊讶地发现,当日期出现在白天(午夜)时,计算出错了。第一行的计算结果表明,在历元中,差值为31449660秒,因此将至1970年12月31日01:01:00 CET。但计算结果应该是60秒。有人能解释一下为什么这个结果是从系统返回的吗?在我的系统上,
man awk
说mktime(datespec)
需要格式YYYY-MM-DD-HH-MM-SS
。但是您通过的是已交换年份和日期的06 08 2014 23 59 36
。您需要重新排列字段。在我的系统上,man awk
表示mktime(datespec)
要求格式为YYYY-MM-DD-HH-MM-SS
。但是您通过的是已交换年份和日期的06 08 2014 23 59 36
。您需要重新排列字段。如果要使用awk
,则不需要所有的sed
和grep
。此外,差异应为60秒,如样本数据所示
从man
页面:
mktime(datespec)将datespec转换为与原样相同形式的时间戳
由systime()返回。它类似于同名函数
在ISO C中,参数datespec是一个格式为“YYYY-MM-DD”的字符串
HH毫米不锈钢[DST]”
请尝试以下命令:
awk '
$1 == "Unavailable" {
split ($2, d1, /[.]/);
split ($3, t1, /:/);
split ($5, d2, /[.]/);
split ($6, t2, /:/);
end = mktime (d2[3]" "d2[2]" "d2[1]" "t2[1]" "t2[2]" "t2[3])
start = mktime (d1[3]" "d1[2]" "d1[1]" "t1[1]" "t1[2]" "t1[3])
print end - start
}' log.txt
60
0
0
0
426
这将以秒为单位打印差异。如果您希望以另一种格式打印输出,您可以使用GNU
awk
库中的函数。如果要使用awk
,您不需要所有的sed
和grep
。此外,差异应为60秒,如样本数据所示
从man
页面:
mktime(datespec)将datespec转换为与原样相同形式的时间戳
由systime()返回。它类似于同名函数
在ISO C中,参数datespec是一个格式为“YYYY-MM-DD”的字符串
HH毫米不锈钢[DST]”
请尝试以下命令:
awk '
$1 == "Unavailable" {
split ($2, d1, /[.]/);
split ($3, t1, /:/);
split ($5, d2, /[.]/);
split ($6, t2, /:/);
end = mktime (d2[3]" "d2[2]" "d2[1]" "t2[1]" "t2[2]" "t2[3])
start = mktime (d1[3]" "d1[2]" "d1[1]" "t1[1]" "t1[2]" "t1[3])
print end - start
}' log.txt
60
0
0
0
426
这将以秒为单位打印差异。如果您希望以另一种格式打印输出,您可以使用GNU
awk
库中的函数。正如我所说,我不是awk大师,但我看到您非常感谢。由于我无法在“从您知道的地方发布的答案”中对您的评论进行投票,我在这里这样做:因为我说我不是awk大师,但是我看到你非常感谢。因为我无法在“你知道在哪里发布的答案”中对你的评论进行投票,我在这里做了:D