gpt4 book ai didi

linux - 寻找时间戳中的间隙

转载 作者:太空狗 更新时间:2023-10-29 11:37:20 25 4
gpt4 key购买 nike

我在一个可能持续 24 小时或更长时间的文件中有以下时间戳:

2014-11-11-04.01.05.000000
2014-11-11-04.03.33.000000
2014-11-11-04.06.02.000000
2014-11-11-04.08.31.000000

每个时间戳之间的间隔应小于 5 分钟。我如何将一个简单的 bash shell 脚本放在一起来解析文件并告诉我是否存在大于 5 分钟的间隔?我看到的最简单的方法是用上一行减去下一行。但是我不太擅长 bash shell 脚本。谁能帮忙?

最佳答案

这使用 GNU date 来解释时间。下面的代码从一个名为 file 的文件中读取,并遍历每一行,检查是否存在超过 300 秒的时间间隔:

while read newline
do
new=$(date -d "$(echo "$newline" | sed -E 's/-([0-9][0-9])\.([0-9][0-9])\./ \1:\2:/')" '+%s')
if [ "$old" ] && (( $new - $old > 300))
then
printf "%4i seconds gap before %s" "$((new - old))" "$newline"
fi
old=$new
done <file

例子

让我们考虑这个测试文件:

$ cat file
2014-11-11-04.01.05.000000
2014-11-11-04.03.33.000000
2014-11-11-04.08.31.000000
2014-11-11-04.13.32.000000
2014-11-11-05.13.33.000000

以上脚本找出超过5分钟的两个间隔:

 301 seconds gap before 2014-11-11-04.13.32.000000
3601 seconds gap before 2014-11-11-05.13.33.000000

观察到这可以检测到小至 5 分 1 秒的间隙。即使分钟没有变化,它也会检测到 1 小时的差距。

工作原理

为了理解时间格式的所有潜在复杂性,GNU date 实用程序用于将时间转换为自纪元以来的秒数。这样做很简单:

$ date -d '2014-11-11 04:01:05.000000' '+%s'
1415707265

我的date(较新的版本可能不同)不支持我们输入的确切格式:

$ date -d '2014-11-11-04.01.05.000000' '+%s'
date: invalid date `2014-11-11-04.01.05.000000'

但是,我们可以使用 sed 使格式看起来像上面有效的格式:

$ date -d "$(echo "$newline" | sed -E 's/-([0-9][0-9])\.([0-9][0-9])\./ \1:\2:/')" '+%s'
1416384000

接下来,就是将这些秒数放入 shell 变量中。为此,使用命令替换:

new=$(date -d "$(echo "$newline" | sed -E 's/-([0-9][0-9])\.([0-9][0-9])\./ \1:\2:/')" '+%s')

使用变量 new 中的最近时间,我们可以查看自上次时间以来是否已经超过 5 分钟(300 秒)(存储在变量 old 中) >),如果是,则打印出一条消息:

if [ "$old" ] && (( $new - $old > 300))
then
printf "%4i seconds gap before %s\n" "$((new - old))" "$newline"
fi

上面的第一个测试,[ "$old"] 确保变量 old 已经被定义。除了我们读入的第一行之外,它将始终被定义。因此,测试 [ "$old"] 的效果是跳过第一行。

第二个测试是(( $new - $old > 300))。这只是确定自上一行以来是否已经超过 300 秒。

如果你的sed不支持-E怎么办

对于 GNU sed-E 表示扩展正则表达式格式。在 Mac OSX 上,将使用 -r 代替它。如果您使用的是不支持 -E 的旧 linux 系统,我们可以尝试使用基本的正则表达式语法。尝试:

$ echo 2014-11-11-04.01.05.000000 | sed  's/-\([0-9][0-9]\)\.\([0-9][0-9]\)\./ \1:\2:/'
2014-11-11 04:01:05.000000

和:

$ date -d "$(echo 2014-11-11-04.01.05.000000 | sed  's/-\([0-9][0-9]\)\.\([0-9][0-9]\)\./ \1:\2:/')" '+%s'
1415707265

如您所见,基本正则表达式和扩展正则表达式之间的区别在于哪些字符必须转义。

如果可行,则使用:

while read newline
do
new=$(date -d "$(echo "$newline" | sed 's/-\([0-9][0-9]\)\.\([0-9][0-9]\)\./ \1:\2:/')" '+%s')
if [ "$old" ] && (( $new - $old > 300))
then
printf "%4i seconds gap before %s" "$((new - old))" "$newline"
fi
old=$new
done <file

关于linux - 寻找时间戳中的间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com