我的脚本(在bash中)旨在完成这项工作:
从文件file_A
获取开始和停止时间。时间范围通常为3-24小时。
根据[start_time, stop_time]
来自file_A
的时间窗口,
我需要在完全10k的日志文件中找到特定的文件(并且会随着实验运行而增加),每个文件记录大约30分钟。也就是说,我必须在10k个中找到6-50个日志文件。
确认正确的日志文件后,我需要打印出有趣的数据。
步骤1)和3)没关系,我已经做到了。 现在,我陷入了第2步,特别是在两个地方:
(a)中。由于日志文件名为time,因此如何有效地按名称选择适当的文件。每个日志文件名为log_201305280650
,表示2013/5月28日06:50。也就是说,根据从file_A获取的时间,我需要通过它们的名称确认相应的日志文件,这是一段时间。
(b)中。选择文件后,从该文件中读取时间窗口内的项目(如温度,压力等)。因为每个文件记录30分钟,这意味着此文件中的某些条目无法满足时间窗口。
例如,
从步骤1)开始,我的时间窗口设置为[201305280638,201305290308]。
从步骤2开始),我知道日志文件(log_201305280650)包含201305280638的开始时间。所以我需要读取201305280638以下条目的所有温度和压力。
the log files name is log_201305280650 (= 2013 / May 28 / 06 :50)
Time temperature pressure ...
201305280628 100, 120 ...
201305280629 100, 120 ...
... ... ...
201305280638 101, 121 ...
201305280639 99, 122 ...
... ... ...
201305280649 101, 119 ...
201305280650 102, 118 ...
我的假脚本正在跟随。
get time_start from /path/file_A
get time_stop from /path/file_A
for file in /path_to_log_files/*
do
case "$file" in
*)
If [[log file name within time window of (time_start, time_stop)]]; then
loop over this file to get the entry whose time is just within (time_start, time_stop)
read out temperature and pressure etc.
fi
esac
done
答案 0 :(得分:0)
使用bash的相当大的工作。 Perl或python会更容易,它们都有日期/时间模块。
我花了一段时间做通常的日期切片,这很糟糕,所以我作弊并使用了文件时间戳。 Bash有一些有限的时间戳检查,这就是使用它。好吧,它做了一些文件IO,但这些都是空文件,到底是怎么回事!
lower=201305280638
upper=201305290308
filename=log_201305280638
filedate=${filename:4}
if (( filedate == upper )) || (( filedate == lower ))
then
echo "$filename within range"
else
# range files
touch -t $lower lower.$$
touch -t $upper upper.$$
# benchmark file
touch -t $filedate file.$$
if [[ file.$$ -nt $upper ]]
then
echo "$filename is too young"
elif [[ file.$$ -ot $lower ]]
then
echo "$filename is too old"
else
echo "$filename is just right"
fi
rm lower.$$ upper.$$ file.$$
fi
-nt
是“比”更新“
-ot
“比年龄大”
因此在开始时检查是否相等。您可以对文件中的时间戳(第二个问题)使用类似的检查。但老实说,你不能使用perl或python吗?
答案 1 :(得分:0)
也许某些事情会对你有用吗?我使用$ start和$ end作为file_A的开始和结束时间。我
eval cat log_{$start..$end} 2> /dev/null | sort -k1 | sed -n "/$start/,/$end/p"
这假设您的日志文件格式为
time temperature pressure ...
没有标题或其他此类文字
答案 2 :(得分:0)
使用awk和date命令的+“%s”选项代替文字日期和时间可能更容易。此选项将日期/时间从纪元(01-01-1970)转换为秒。得到的数字很容易使用。毕竟,这只是一个数字。作为一个例子,我做了一个小的bash脚本。首先,模拟:
#!/bin/bash
#simulation: date and time
start_dt="2013-09-22 00:00:00"
end_dt="2013-09-22 00:00:00"
start_secs=$(date -d "start_dt" +"%s")
end_secs=$(date -d "end_dt" +"%s")
#simulation: set up table (time in secs, temperature, pressure per minute)
> logfile
for ((i=$start_secs;i<$end_secs;i=i+60)); do
echo $i $[90+$[RANDOM %20]] $[80+$[RANDOM %30]] >> logfile
done
以下是获取用户范围并将其打印出来的实际脚本:
echo "Enter start of range:"
read -p "Date (YYYY-MM-DD): "sdate
read -p "Time (HH:MM:SS) : "stime
echo "Enter end of range:"
read -p "Date (YYYY-MM-DD): "edate
read -p "Time (HH:MM:SS) : "etime
#convert to secs
rstart=$(date -d "$sdate $stime" +"%s")
rend=$(date -d "$edate $etime" +"%s")
#print it to screen
awk -v rstart=$rstart -v rend=$rend '{if($1 >= rstart && $1 <= rend)print $0}' logfile
awk命令非常适合这个。它速度快,可以处理大文件。我希望这会给你一些想法。