我有一个名为Test1.dat的文件,其内容如下
Abcxxxxxxxxxxx_123.dat@10:10:15
Bcdxxxxxxxxxxx_145.dat@10:15:23
Cssxxxxxxxxxxx_567.dat@10:26:56
Fgsxxxxxxxxxxx_823.dat@10:46:56
Kssxxxxxxxxxxx_999.dat@11:15:23
请注意,在@符号后面是HH:MM:SS格式。我现在的问题是我想计算当前时间和文件中存在的时间之间的时间差,并仅获取时间差超过30分钟的文件名。因此,如果当前时间是11:00:00,我想获取30分钟前已到达的文件,所以基本上是前三个文件。
答案 0 :(得分:2)
此awk
应该:
awk -F@ '$2>=from && $2<=to' from="$(date +%H:%M:%S -d -30min)" to="$(date +%H:%M:%S)" file
如果你只需要最后30分钟(在你的情况下你需要第一个,因为你不喜欢11:30):
awk -F@ '$2>=from' from="$(date +%H:%M:%S -d -30min)" file
答案 1 :(得分:1)
您也可以使用bash脚本获取结果
#!/bin/bash
current=`date '+%s'`
needed_time=`echo "$current - 60 * 30" | bc`
while read line ; do
time=`echo $line |sed -r 's/[^@]*.(.*)/\1/g'`
user_time=`date -d $time '+%s'`
if [ $user_time -le $needed_time ] ; then
echo "$line"
fi
done < file_name
答案 2 :(得分:1)
这可能是答案吗?
awk -F@ '{ts = systime(); thirty_mins = 30 * 60; thirty_mins_ago = ts - thirty_mins; if ($2 < strftime("%H:%M:%S", thirty_mins_ago)) print $2 }' <file.txt
strftime
是GAWK(gnu awk)扩展名。