Bash 按小时计算平均响应时间
我试图从日志文件中每小时计算平均响应时间,该日志文件有数百万条记录,下面是日志摘录 到目前为止,我正在尝试创建temproary文件,该文件将具有唯一id、开始时间和结束时间的行,之后,另一个脚本将在此临时文件上运行,以计算每个小时的平均响应时间 我的脚本需要一个多小时才能创建临时文件 我们有什么办法可以做得更快吗?或者更好的脚本,其执行时间更短。 注意:这些UNIQID不是按顺序出现的Bash 按小时计算平均响应时间,bash,shell,unix,awk,Bash,Shell,Unix,Awk,我试图从日志文件中每小时计算平均响应时间,该日志文件有数百万条记录,下面是日志摘录 到目前为止,我正在尝试创建temproary文件,该文件将具有唯一id、开始时间和结束时间的行,之后,另一个脚本将在此临时文件上运行,以计算每个小时的平均响应时间 我的脚本需要一个多小时才能创建临时文件 我们有什么办法可以做得更快吗?或者更好的脚本,其执行时间更短。 注意:这些UNIQID不是按顺序出现的 log file format 2012-06-04 13:04:19,324 UNIQID1 2012-0
log file format
2012-06-04 13:04:19,324 UNIQID1
2012-06-04 13:04:20,120 UNIQID1
2012-06-04 13:05:19,324 UNIQID2
2012-06-04 13:06:20,120 UNIQID2
2012-06-04 13:07:19,324 UNIQID3
2012-06-04 13:08:20,120 UNIQID3
2012-06-04 13:08:49,324 UNIQID4
2012-06-04 13:09:50,120 UNIQID4
这是我的密码:
uids=`cat $i|grep "UNIQ" |sort -u` >> $log
for uid in ${uids}; do
count=`grep "$uid" test.log|wc -l`
if [ "${count}" -ne "0" ]; then
unique_uids[counter]="$uid"
let counter=counter+1
fi
done
echo ${unique_uids[@]}
echo $counter
echo " Unique No:" ${#unique_uids[@]}
echo uid StartTime EndTime" > $log
for unique_uids in ${unique_uids[@]} ; do
responseTime=`cat $i|grep "${unique_uids}" |awk '{split($2,Arr,":|,"); print Arr[1]*3600000+Arr[2]*60000+Arr[3]*1000+Arr[4]}'|sort -n`
echo $unique_uids $responseTime >> $log
done
谢谢你的时间 一些简单的修复:
- 你不需要电话;只需将文件名用作
的最后一个参数grep
- 您不应该将值同时保存到文件和变量中;用快一点的。通常你不必使用这两种方法;而IFS=read-r日期时间id循环可能会更快
- 你不需要电话;只需将文件名用作
的最后一个参数grep
- 您不应该将值同时保存到文件和变量中;用快一点的。通常你不必使用这两种方法;而IFS=read-r日期时间id循环可能会更快
- 一些简单的修复:
- 您的脚本有几个问题,我想您会发现下面的脚本更适合您的需要。首先,您不需要生成所有这些进程来完成这项工作——在awk中完成这项工作相当简单。此外,您发布的代码假定特定的UNIQID只会在同一天发生。如果你的记录从午夜一直到第二天,这个假设会引起很大的悲痛
以下代码在
awk
脚本中执行您想要的操作。它假定您正在使用gawk
(Gnu awk)。如果没有,您可以在web上找到mktime的awk
实现
您的脚本有几个问题,我想您会发现下面的脚本更适合您的需要。首先,您不需要生成所有这些进程来完成这项工作——在awk中完成这项工作相当简单。此外,您发布的代码假定特定的UNIQID只会在同一天发生。如果你的记录从午夜一直到第二天,这个假设会引起很大的悲痛 以下代码在
awk
脚本中执行您想要的操作。它假定您正在使用gawk
(Gnu awk)。如果没有,您可以在web上找到mktime的awk
实现
这属于codereview.stackexchange.com。您是否在使用Gnu awk的Linux系统上运行?这属于codereview.stackexchange.com。您是否在使用Gnu awk的Linux系统上运行?谢谢您的建议。是的,我同意,因为我对脚本编写还不熟悉,所以您可能会在代码中看到新手风格。我正在GNU AWK上使用。我会试试这个,让你知道结果Hi-Ram,我在运行这段代码时遇到了问题。我已经编写了这个test.awk,命令m使用的是:awk-f test.awk test.log>output.log实际上我正在使用另一个awk在日志文件中获取uid并将它们放入数组中。因此,在使用您的awk时,我无法将这些uid传递给您的awk。下面是获取uid uid的代码=
cat$i|grep“Service”| awk'BEGIN{FS=“lt;”RS=“gt;”}{print$2;}| sort-u
然后您是否只想让那些uid(即终止于|sort-u
的命令的结果)成为您在日志文件中查找的uid?换句话说,就是那些你想要平均响应时间的UID。正确?正确的Ram。为什么我要这样做,因为这些日志包含嵌入的xml文件,我正在从xml中取出UID。希望我能把事情说清楚。谢谢谢谢你的建议。是的,我同意,因为我对脚本编写还不熟悉,所以您可能会在代码中看到新手风格。我正在GNU AWK上使用。我会试试这个,让你知道结果Hi-Ram,我在运行这段代码时遇到了问题。我已经编写了这个test.awk,命令m使用的是:awk-f test.awk test.log>output.log实际上我正在使用另一个awk在日志文件中获取uid并将它们放入数组中。因此,在使用您的awk时,我无法将这些uid传递给您的awk。下面是获取uid uid的代码=cat$i|grep“Service”| awk'BEGIN{FS=“lt;”RS=“gt;”}{print$2;}| sort-u
然后您是否只想让那些uid(即终止于|sort-u
的命令的结果)成为您在日志文件中查找的uid?换句话说,就是那些你想要平均响应时间的UID。正确?正确的Ram。为什么我要这样做,因为这些日志包含嵌入的xml文件,我正在从xml中取出UID。希望我能把事情说清楚。谢谢谢谢,我也会试试这个。谢谢,我也会试试这个。
BEGIN {
while (getline < UIDFILE) {
x[$0] = 1; # Awk will maintain these as an associative array, lookups are hashed
}
}
{
r = $NF; # Extract the unique ID from the record into r
if (r in x) { # If the UID is something we are interested in, then ...
ts = $1 " " $2; # concatenate these fields
gsub ("[:-]", " ", ts); # Replace the : and - with spaces
gsub (",.*", "", ts); # Remove everything after the comma
# print ts, mktime(ts) # If you want to see what mktime does
if (x[r] == "") # First time seeing this unique ID?
x[r] = mktime(ts); # Store the timestamp
else { # We're seeing it the second time
now = mktime(ts) # Keep track of the current log time
rt = now - x[r]; # Compute the delta
delete (x[r]) # We don't need it any more
# printf "Record <%s> has response time %f\n", r, rt; # Print it out if you'd like
hourrt += rt; # Add it to this hour's total response time
num++; # And also keep track of how many records we have ending in this hour
if (now % 3600 == 0) { # Have we switched to a new hour?
printf "Average response time = %f\n", hourrt / num; # Dump the average
num = hourrt = 0;
}
}
}
}
gawk -v UIDFILE=name_of_uid_file -f scriptname.awk